请注意以下内容
[admin@myVM ~]$ test="echo hello && echo world"
[admin@myVM ~]$ $test
hello && echo world
[admin@myVM ~]$ echo hello && echo world
hello
world
看来,如果你放置&&进入bash变量并将其作为命令执行,bash解释&&作为字符串参数。有谁知道如何改变这种行为?也就是说,有没有人知道怎么告诉bash“我想要执行双&符号”。
答案 0 :(得分:5)
变量并不意味着存储脚本。将代码存储在函数中,而不是变量。
$ test() { echo hello && echo world; }
$ test
hello
world
$test
不起作用的原因是因为不带引号的变量扩展只受到bash的两个解析阶段的影响:
这意味着它会将$test
拆分为单独的单词,这就是它识别echo
命令的原因。它还将扩展通配符AKA globs。不过,这些只是解析它的两个部分。它不会查找&&
,|
或;
等符号。
我不推荐它,但您可以使用bash -c "$test"
或eval "$test"
来执行bash来执行字符串。除非绝对必要,否则这些都是你应该避免的坏习惯。函数比使用eval
的hack好得多,并且它们不会通过允许任意代码执行来打开潜在的安全漏洞。