Bash:执行包含管道的变量内容

chr*_*s01 5 bash

#!/bin/bash

# 1st part
ret=$(ps aux | grep -v grep)    # thats OK 
echo $ret

# 2nd part
cmd="ps aux | grep -v grep"     # a problem with the pipe | 
ret=$($cmd)         
echo $ret
Run Code Online (Sandbox Code Playgroud)

我如何使用第二部分中的命令字符串?认为管道是问题.试图逃避它,但它没有帮助.得到ps的一些snytax错误.

谢谢!

Jac*_*ack 6

你需要eval

ret=$(eval "$cmd")
Run Code Online (Sandbox Code Playgroud)

  • 请注意,在嵌套的 eval 中很难正确引用和反斜杠;如果字符串的一部分来自用户,那么使用 eval 是非常不安全的。 (4认同)

Ini*_*ian 5

eval这里不推荐使用.它可能导致意外结果,尤其是在可以从不受信任的来源读取变量时(参见BashFAQ/048 - Eval命令和安全问题).

您可以通过定义和调用函数来以简单的方式解决此问题,如下所示

ps_cmd() {
    ps aux | grep -v grep
}
Run Code Online (Sandbox Code Playgroud)

并在脚本中使用它

output="$(ps_cmd)"
echo "$output"
Run Code Online (Sandbox Code Playgroud)

另外一个好的解释是看看为什么在变量中存储命令不是一个好主意并且有很多潜在的陷阱 - BashFAQ/050 - 我试图将命令放在变量中,但复杂的情况总是失败!