调用存储在变量中的某些命令的正确方法是什么?
1和2之间有区别吗?
#!/bin/sh
cmd="ls -la $APPROOTDIR | grep exception"
#1
$cmd
#2
eval "$cmd"
调用存储在变量中的某些命令的正确方法是什么?
1和2之间有区别吗?
#!/bin/sh
cmd="ls -la $APPROOTDIR | grep exception"
#1
$cmd
#2
eval "$cmd"
Answers:
Unix Shell在执行输入之前,会对输入的每一行进行一系列转换。对于大多数shell,它看起来像这样(摘自bash
联机帮助页):
$cmd
在参数扩展阶段,直接使用直接将其替换为命令,然后进行以下所有转换。
eval "$cmd"
直到引号删除阶段都将使用using ,直到将其$cmd
原样返回并作为参数传递给eval
,该函数的功能是在执行之前再次运行整个链。
因此,基本上,它们在大多数情况下是相同的,并且在您的命令使用转换步骤直至参数扩展时是不同的。例如,使用括号扩展:
$ cmd="echo foo{bar,baz}"
$ $cmd
foo{bar,baz}
$ eval "$cmd"
foobar foobaz
eval "$cmd"
不写怎么办eval
?$($cmd)
?${$cmd}
?
eval
操作将数据解析为语法;因此,它对安全性非常敏感,因此隐式地进行操作将是非常糟糕的形式。
如果您只是在执行操作eval $cmd
时cmd="ls -l"
(以交互方式并在脚本中)执行操作,则将获得所需的结果。在您的情况下,您的管道带有不带模式的grep,因此grep部分将失败,并显示一条错误消息。只是$cmd
会生成“找不到命令”(或某些类似消息)消息。因此,请尝试使用eval并使用完成的命令,而不是生成错误消息的命令。
我认为你应该把
`
(反引号)符号放在变量周围。