为什么命令替换输出中的分号与原始代码中的分号不同?
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] 查看是否可以将每个结果词视为文件名匹配模式,如果是,则将它们与本地文件系统进行匹配。
根据我对命令替换的理解,这应该有效,但它不起作用,你能解释一下为什么以及如何做这样的事情吗?
为什么这样做:
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] 查看是否可以将每个结果词视为文件名匹配模式,如果是,则将它们与本地文件系统进行匹配。