在ksh93,Solaris中执行多个命令的Eval

时间:2011-07-11 22:36:44

标签: solaris eval ksh

我想连续执行两个或更多命令。但是这些命令存储在我的脚本中的变量中。例如,

var="/usr/bin/ls ; pwd ; pooladm -d; pooladm -e"

当我通过我的脚本执行此变量时出现问题。 假设我去了:

#!/bin/ksh -p
..
..
var="/usr/bin/ls ; pwd;pooladm -d; pooladm -e"
..
..
$var # DOES NOT WORK ..BUT WORKS WITH EVAL

它不起作用.. 但是我使用eval的那一刻:

eval $var

它的工作非常出色。

我只是想知道是否有其他方法可以在不使用eval的情况下执行存储在变量中的一堆命令。

同样,eval使用是否被认为是一种糟糕的编程习惯,因为我的编码标准似乎避免使用它而不是接受它。请告诉我。

3 个答案:

答案 0 :(得分:2)

请记住,shell只解析一次该行。因此,当您扩展$ var时,它将成为包含空格的一个字符串。由于您没有名为'/ usr / bin / ls的可执行文件; pwd; pooladm -d; pooladm -e',它无法运行它。

另一方面,eval将其参数重新扫描它们,现在你得到'/ usr / bin / ls','pwd'等等。它有效。

eval是一个小小的问题因为它留下了一个可能的安全漏洞 - 考虑是否有人设法将'rm -rf /'放入字符串中。但它是一个有用的工具。

答案 1 :(得分:1)

使用反引号和回声。在你的情况下

`echo $var`

答案 2 :(得分:1)

您可以调用shell的另一个副本来运行命令:

sh -c "$var"

这不一定比使用eval更好。主要的实际区别是eval将在当前shell的上下文中运行命令,而“sh -c”在单独的shell实例中运行命令。如果var包含设置环境变量或更改当前目录的命令,则您或可能不希望这些命令影响当前shell。