我已经了解到,在Bash中运行命令时,在命令执行之前完成文件名扩展.但是在尝试下面的命令时(使用-x选项):
touch foo=3 # Create a file with name "foo=3"
+ touch foo=3
declare foo=?
+ declare 'foo=?'
alias foo=*
+ alias 'foo=*'
Run Code Online (Sandbox Code Playgroud)
我得不到我的期望,因为foo =?并且foo =*未扩展为文件名"foo = 3":
declare -p | grep 'foo=' # => foo='?'
alias | grep 'foo=' # => alias foo='*'
Run Code Online (Sandbox Code Playgroud)
但是如果我运行另一个类似cd的内置函数或者接受赋值作为自己编写的参数的函数,就像show_rhs() { echo "${1%=*}='${1#*=}'"; }
我得到的那样(foo =?和foo =*被展开).
cd foo=? # => foo=3: Not a directory
show_rhs() foo=* # => foo='3'
Run Code Online (Sandbox Code Playgroud)
我可以在这里看到的唯一区别是申报和别名是内置插件和接受工作任务作为参数.根据-x选项的输出,似乎添加了一对引用以在文件名扩展之前包含赋值.
但是如果文件名扩展在命令执行之前运行而不管命令是什么,那么传入declare和alias的参数应该是foo = 3而不是foo =?和foo =*由于存在文件"foo = 3".
那么Bash在文件名扩展之前根据命令做一些特殊的事情(可能引用通配符?)到"a = b"类似的参数?
(我的环境:CentOS …