$ echo $(echo x; echo y)
x y
$ a='echo x; echo y'
$ echo $($a) # expect 'x y'
x; echo y
eval
和的情况下对存储在变量中的命令列表执行命令替换bash -c
?echo $(eval $a)
并echo $(bash -c "$a")
确实完成了我想要的操作,但是我听说使用eval通常是解决问题的错误方法,因此我想知道如何在没有这些命令的情况下进行管理(使用bash -c
实际上是同一回事)
分词发生在命令评估的后期。对您而言最关键的是,它发生在变量扩展和命令替换之后。
这意味着第二行
s="echo a; echo b"
echo $($s)
将首先$s
扩展到echo a; echo b
,然后执行该命令,而不将其拆分为由两个echo
s组成的复合命令。
(详见:$s
获取拆分成四个词,echo
,a;
,echo
和b
的封装。$(...)
执行该作为一个命令,echo
有三个参数,a;
,echo
和b
。)
echo
因此,给予最外层的是字符串a; echo b
(实际上是三个单词,$(...)
没有引号),因为这是最内层输出的echo
。
比较一下
s1="echo a"
s2="echo b"
echo $($s1;$s2)
结果就是您所期望的。
是的,eval
在大多数情况下,“是邪恶的”,sh -c
既笨拙又脆弱。但是,如果您对外壳脚本中的字符串信任一些外壳代码,则这些工具是使该代码正确执行的唯一(?)方法,因为这通常需要明确评估字符串中的文本作为外壳程序代码(评估的所有阶段从头到尾)。特别是如果它是复合命令。
我认为这仅仅是由于Unix shell与文本的密切关系,您才幸运地echo $($s)
执行了所有操作。
只需考虑一下获取C程序以执行一段以字符串形式给出的C代码所必须采取的步骤...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句