为什么命令替换输出中的分号与原始代码中的分号不同?

Why isn't a semicolon in command substitution output treated identical to one in the original code?

根据我对命令替换的理解,这应该有效,但它不起作用,你能解释一下为什么以及如何做这样的事情吗?


为什么这样做:

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 中的字符上将结果分成 "words" —— 或者,默认情况下,空格。
[2] 查看是否可以将每个结果词视为文件名匹配模式,如果是,则将它们与本地文件系统进行匹配。