为何Bash命令替换执行时未作为shell语句解析?
问题原因解析
要理解这个现象,核心是搞清楚Bash的语法解析和扩展的执行顺序:
- 首先,Bash对语句的语法解析(识别分号
;、管道符|、重定向符>这类特殊符号作为语法分隔符的步骤),优先级远高于变量扩展、命令替换这类操作。 - 当你执行
d=$c``时,$c的变量扩展发生在语法解析之后,所以扩展后得到的字符串里的;只会被当成普通的文本字符,不会被识别为命令分隔符。 - 变量扩展完成后,Bash只会对结果做单词拆分和通配符扩展,最终拆分得到的第一个令牌是
echo,剩余的123、;、echo、124全部会被作为echo命令的入参处理,实际执行的命令等价于echo "123" ";" "echo" "124",输出自然就是123 ; echo 124。
如果要实现你预期的效果,也就是把变量里的内容当作完整的shell语句解析执行,可以用eval强制触发二次解析:
c="echo 123 ; echo 124" d=$(eval "$c") echo $d # 输出为 123 124
你提到的Bash官方手册里的描述和这个现象并不冲突:那句描述说的是命令替换会在子shell里执行内部的命令,你示例里的命令确实是在子shell执行的,只是执行的命令本身是单条带参数的echo,而非两条分开的echo命令而已。
内容的提问来源于stack exchange,提问作者yuanjianpeng
相关产品推荐
相关产品推荐

