在 ksh93、Solaris 中评估多个命令执行
我想连续执行两个或多个命令。但这些命令存储在我的脚本中的变量中。例如,
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 的使用是否被认为是一种不好的编程实践,因为我的编码标准似乎回避它的使用而不是接受它。请告诉我。
I would like to execute two or more commands back to back . But these commands are stored in a variable in my script. For example,
var="/usr/bin/ls ; pwd ; pooladm -d; pooladm -e"
The problem arises when I execute this variable via my script.
Suppose I go:
#!/bin/ksh -p
..
..
var="/usr/bin/ls ; pwd;pooladm -d; pooladm -e"
..
..
$var # DOES NOT WORK ..BUT WORKS WITH EVAL
It doesn't work ..
But the moment I use eval :
eval $var
It works brilliantly.
I was just wondering if there is any other way to execute a bunch of commands stored in a variable without using eval.
Also , Is eval usage considered a bad programming practice because my coding standards appear to shun its usage than embrace it . Please do let me know.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
请记住,shell 仅解析该行一次。因此,当您扩展 $var 时,它会变成一个包含空格的字符串。由于您没有名为 '/usr/bin/ls 的可执行文件;密码;pooladm -d; pooladm -e',它无法运行它。
另一方面,eval 接受它的参数并重新扫描它们,现在你得到'/usr/bin/ls'、'pwd'等等。有用。
eval
有点冒险,因为它留下了一个可能的安全漏洞——考虑一下是否有人设法将“rm -rf /”放入字符串中。但这是一个有用的工具。Remember that the shell only parses the line once. So when you expand your $var, it becomes one string containing blanks. Since you have no executable named '/usr/bin/ls ; pwd;pooladm -d; pooladm -e', it can't run it.
On the other hand, eval takes its arguments are re-scans them, now you get '/usr/bin/ls', 'pwd', and so on. It works.
eval
is a little chancy because it leaves a possible security hole -- consider if someone managed to get 'rm -rf /' into the string. But it's a useful tool.使用反引号和回显。在你的情况下
Use backticks and echo. In your case
您可以调用 shell 的另一个副本来运行该命令:
这并不一定比使用 eval 更好。主要的实际区别是 eval 将在当前 shell 的上下文中运行命令,而“sh -c”在单独的 shell 实例中运行命令。如果 var 包含设置环境变量或更改当前目录的命令,您可能不希望这些命令影响当前 shell。
You could invoke another copy of the shell to run the command:
This isn't necessarily better than using eval. The main practical difference is that eval will run the commands in the context of the current shell, while "sh -c" runs the commands in a separate shell instance. If
var
contains commands to set environment variables or change the current directory, you or may not want those commands to affect the current shell.