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

Chu*_*ang 1 bash variable-expansion pathname

我正在努力与Bash变量扩展.请参阅以下代码:

~/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
Run Code Online (Sandbox Code Playgroud)

由于扩展的顺序是brace-> tilde-> parameter - > ....-> pathname,为什么路径名扩展不应用于$a第二个命令中的相同方式?

[添加]

空格逃逸是否隐藏了以下输出的行为?

~/tmp 705$ a=~/Library/Application*; echo $a
/Users/foo/Library/Application Scripts /Users/foo/Library/Application Support
Run Code Online (Sandbox Code Playgroud)

mkl*_*nt0 8

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

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

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

在可变的情况下分配仅涉及文字串内插(对于其他变量的引用),NO路径扩展发生时,即使有未引用的字符串(例如,a=*,a="*",和a='*'所有分配文字 *)[1] .

(与此相反,路径扩展施加到无引号字符串的内部阵列定义(例如,a=(*)或者一个内部命令替换(e..g, a=$(echo *)).)

因此,字面意思$a/Users/foo/Library/Application *

执行echo $a- 即,不重复引用变量引用$a- 然后应用单词拆分并执行以下操作:

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

*在您的情况下后者导致的事实意味着您恰好echo目录运行命令(保存默认配置,保存隐藏文件).


[1]然而,字符串是否未加引号对于波浪扩展是否重要 ; 例如,a=~扩展~到用户的主目录,而a='~'a="~"指定文字 ~.