在我对命令替换的理解中,这应该有效,但是不能,您能否解释一下为什么以及如何执行这样的操作。
为什么这样做:
cd ..; echo 123 # output is "123",after changing directories
...如果不这样做:
cd $(echo "..; echo 123") # error message is "cd: too many arguments"
在我对命令替换的理解中,这应该有效,但是不能,您能否解释一下为什么以及如何执行这样的操作。
为什么这样做:
cd ..; echo 123 # output is "123",after changing directories
...如果不这样做:
cd $(echo "..; echo 123") # error message is "cd: too many arguments"
命令替换结果(如变量的扩展)未经过所有解析阶段;它们仅会经历单词拆分[1]和全局扩展[2],甚至只有在扩展本身未加引号的情况下才会发生。
这意味着您的结果与以下内容相同:
cd "..;" "echo" "123"
...分号被视为文字,将传递给cd
命令,而不是shell语法。
这是一个功能,而不是错误:如果将命令替换结果解析为语法,则基本上不可能编写用于处理不受信任数据的安全Shell脚本。
[1]将结果分成IFS
中字符上的“单词”,或者默认情况下为空格。
[2]查看是否可以将每个结果单词视为文件名匹配模式,如果可以,则将其与本地文件系统匹配。