Bash:如何正确引用命令的结果

时间:2015-11-06 21:45:07

标签: bash shell escaping

我的问题归结为:

echo $(echo '*')

输出当前目录中所有文件的名称。 我不要那个。我想要一个文字星号(*)。

如何以通用方式执行此操作?

上面的例子很简单。星号不是字面上写在我的bash脚本中 - 它来自另一个命令的结果。

所以这可能更接近我的实际情况:

echo $(my-special-command)

我只想获得my-special-command的文字输出;我希望扩展任何嵌入的星号(或其他特殊字符)。

如何以通用方式执行此操作?

我想在运行命令之前我可以set -f,但我怎么能确定涵盖所有内容?这会关闭路径扩展,但其他类型呢?我无法控制my-special-command可能产生的输出,因此必须能够正确处理所有内容。

3 个答案:

答案 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 "*")"