【问题标题】:Bash: execute content of variable including pipe [duplicate]Bash:执行变量的内容,包括管道[重复]
【发布时间】:2018-01-04 15:14:57
【问题描述】:
#!/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 的语法错误。

谢谢!

【问题讨论】:

  • 这是由求值顺序造成的,例如here
  • 另见BashFAQ #50
  • (说到,我们每周收到的常见问题解答怎么能达到 +5?!)

标签: bash


【解决方案1】:

你需要eval:

ret=$(eval "$cmd")

【讨论】:

  • 请注意,在嵌套的 eval 中正确引用和反斜杠是相当困难的;如果字符串的一部分来自用户,那么使用 eval 是非常不安全的。
  • 感谢您提供实际有效的答案!现在,如果你能解释为什么你不能只做 ret=eval $cmd
【解决方案2】:

这里不推荐使用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!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-12
    • 2018-03-20
    • 1970-01-01
    • 2015-12-25
    • 2021-03-29
    • 2016-11-17
    • 2021-06-05
    • 1970-01-01
    相关资源
    最近更新 更多