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)
要做你想做的事,你必须使用以下内容:
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="~"指定文字 ~.