在 ksh93、Solaris 中评估多个命令执行

发布于 2024-11-23 15:46:28 字数 511 浏览 3 评论 0原文

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

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

成熟的代价 2024-11-30 15:46:29

请记住,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.

怪我入戏太深 2024-11-30 15:46:29

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

`echo $var`

Use backticks and echo. In your case

`echo $var`
溺ぐ爱和你が 2024-11-30 15:46:29

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

sh -c "$var"

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

You could invoke another copy of the shell to run the command:

sh -c "$var"

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文