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

时间:2018-01-04 15:14:58

标签: 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

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

谢谢!

2 个答案:

答案 0 :(得分:5)

此处不建议使用eval。它可能会导致意外结果,尤其是可以从不受信任的来源读取变量时(请参阅BashFAQ/048 - Eval command and security issues

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

ps_cmd() {
    ps aux | grep -v grep
}

并在脚本中将其用作

output="$(ps_cmd)"
echo "$output"

另外一个好的解释是看看为什么在变量中存储命令不是一个好主意并且有很多潜在的陷阱 - BashFAQ/050 - I'm trying to put a command in a variable, but the complex cases always fail!

答案 1 :(得分:3)

您需要eval

ret=$(eval "$cmd")