从运行bash脚本构建的命令

吉廷

我在bash脚本构建这样的命令

a="my_cmd";
a="$a --verbose";
echo $a;
$a;

它的工作原理和正确执行我的命令。但是,当我添加一个环境变量设置为混合它打破。

a="my_cmd";
a="URL=myurl $a --verbose";
echo $a;
$a;

它打破了在“URL = myurl”的说法没有这样的文件或目录,但如果我运行使用eval()实现的命令正常工作。

a="my_cmd";
a="URL=myurl $a --verbose";
echo $a;
eval "$a";

为什么要加入环境变量的组合在第二个例子打破了我的命令。

吉勒斯“别再邪恶了”

当你离开一个变量扩展不带引号的,它经历了分词文件名扩展(即通配)。它不解析为一个shell命令。一般来说,当你动态地构造一个壳段执行,执行正确的方法是eval "$a",其中a含有解析作为shell代码的字符串。

在你的第一个片段,值a是字符串my_cmd --verbose分词分解成两个词my_cmd--verbose通配什么也不做,因为有任何的话没有通配符。从膨胀产生的命令$a从而由两个词my_cmd--verbose,因此命令my_cmd(其可以是一个别名,函数,一个内置或在PATH可执行)与单个参数执行--verbose

在第二个片段,事情是类似的,与三个单词从膨胀引起:URL=myurlmy_cmd--verbose这导致试图执行命令URL=myurl有两个参数。

shell命令URL=myurl my_cmd --verbose的不同分析:第一个字被解析为一个变量赋值URL,并且因为是后一个命令名分配设置环境变量只对命令的持续时间。这是分析,不是一件扩张之后进行的一部分,所以它需要等号是壳源代码的一部分,等号不能是一些扩张的结果。

不带参数的命令保存到一个字符串使用数组。对于一个复杂的命令,如一个在其中设置变量或除了运行命令执行重定向,使用功能,如果可能的话,如果不使用eval(以小心翼翼的适当引用)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章