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

在我对命令替换的理解中,这应该有效,但是不能,您能否解释一下为什么以及如何执行这样的操作。


为什么这样做:

cd ..; echo 123            # output is "123",after changing directories

...如果不这样做:

cd $(echo "..; echo 123")  # error message is "cd: too many arguments"
lx463419 回答:为什么命令替换输出中的分号与原始代码中的分号不同?

命令替换结果(如变量的扩展)未经过所有解析阶段;它们会经历单词拆分[1]和全局扩展[2],甚至只有在扩展本身未加引号的情况下才会发生。

这意味着您的结果与以下内容相同:

cd "..;" "echo" "123"

...分号被视为文字,将传递给cd命令,而不是shell语法。

这是一个功能,而不是错误:如果将命令替换结果解析为语法,则基本上不可能编写用于处理不受信任数据的安全Shell脚本。


[1]将结果分成IFS中字符上的“单词”,或者默认情况下为空格。
[2]查看是否可以将每个结果单词视为文件名匹配模式,如果可以,则将其与本地文件系统匹配。

本文链接:https://www.f2er.com/2974649.html

大家都在问