为什么这个Bash路径名扩展不会发生?

时间:2014-12-19 02:27:14

标签: bash pathname variable-expansion

我正在努力克服变量扩展。请参阅以下代码:

~/tmp 689$ a=~/Library/Application\ *; echo $a
/Users/foo/Library/Application *

~/tmp 690$ echo ~/Library/Application\ *
/Users/foo/Library/Application Scripts /Users/foo/Library/Application Support

由于扩展顺序为括号 - >代字号 - >参数 - > ...> - >路径名, 为什么路径名扩展未应用于$a的方式与第二个命令中的方式相同?

[加入]

空格转义是否隐藏了以下输出的行为?

~/tmp 705$ a=~/Library/Application*; echo $a
/Users/foo/Library/Application Scripts /Users/foo/Library/Application Support

1 个答案:

答案 0 :(得分:8)

要做你想做的事,你必须使用以下内容:

a=(~/Library/Application\ *)  # use an *array* to capture the pathname-expanded results
echo "${a[@]}"                # output all array elements (without further expansion)

至于为什么你的代码不起作用:

在变量赋值的上下文中仅涉及文字字符串插值(对其他变量的引用), NO路径名扩展即使使用未加引号字符串(例如a=*a="*"a='*'也会分配文字 * [1]

(相比之下,路径名扩展 应用于数组定义中的未加引号的字符串(例如a=(*),或命令替换< / em>(例如,a=$(echo *))。)

因此,$a的文字内容为/Users/foo/Library/Application *

执行echo $a - 即,不要双引号变量引用$a - 然后应用分词并执行以下操作:

  • 打印文字'/Users/foo/Library/Application'(第一个字 - 由于其内容而未应用扩展)
  • 它打印应用于*的路径名扩展(第二个单词 - 即,它扩展为当前目录中的匹配文件名。)

后者在您的情况下导致*这一事实意味着您恰好在目录中运行echo命令(除了隐藏文件,假设默认配置)。


[1] 但是,字符串是否未加引号确实与代表扩展有关;例如,a=~~扩展到用户的主目录,而a='~'a="~"分配文字 ~