我的问题归结为:
echo $(echo '*')
输出当前目录中所有文件的名称。
我不要那个。我想要一个文字星号(*
)。
如何以通用方式执行此操作?
上面的例子很简单。星号不是字面上写在我的bash脚本中 - 它来自另一个命令的结果。
所以这可能更接近我的实际情况:
echo $(my-special-command)
我只想获得my-special-command
的文字输出;我不希望扩展任何嵌入的星号(或其他特殊字符)。
如何以通用方式执行此操作?
我想在运行命令之前我可以set -f
,但我怎么能确定涵盖所有内容?这会关闭路径扩展,但其他类型呢?我无法控制my-special-command
可能产生的输出,因此必须能够正确处理所有内容。
答案 0 :(得分:3)
只需用双引号括起Command substitution:
echo "$(my-special-command)"
答案 1 :(得分:1)
它被称为globbing,你有多种方法可以阻止它:
echo * # will expand to files / directories
echo "*" # Will print *
echo '*' # Will also print *
在您的示例中,您可以简单地写一下:
echo "$(echo '*')"
您也可以使用bash -f script.sh
或代码内部调用脚本中的globbing:
#!/usr/bin/env bash
set -f
echo *
答案 2 :(得分:1)
来自"命令替换"手册页的一部分:
如果[command]替换出现在双引号内,则单词拆分和 不对结果执行路径名扩展。
通过引用命令扩展,可以防止其结果*
进行路径名扩展。
$ echo "$(echo "*")"