Bash:在字符串中执行复杂命令,捕获输出并返回代码

时间:2017-03-23 00:56:00

标签: bash shell

我想在bash中执行一个字符串中的命令,并捕获输出和退出代码。

我在谷歌上搜索了一下并在这里搜索,但我没有得到明确的结果。被引用的Bash FAQ #50很大程度上是一种劝阻人们不去做的居高临下的尝试。例如,我的一个原因是日志记录,但是使用set -x向终端回显命令不是日志记录,并且复杂命令的输出过多且不直观,当我想要的是确定我已经记录了确切的命令我的脚本运行,而不是副本&amp;粘贴将无法在路上</rant>的某个时刻更新。我正在详细解释这个问题的原因是关于这个主题的大多数问题都被重复关闭,但是执行字符串和捕获输出的具体要求似乎没有被表示出来。

这是一个简化的例子。

CMD="echo 'a*b*c' | cut -d '*' -f 2"

输出应为b。现在我想要的是返回代码(EXITCODE=$?)和输出。在我看来,这似乎是一个直截了当的案例,但我无法到达那里。我在网上搜索过的东西(这些都是网上发现的东西):

OUTPUT=eval $CMD    # "", ec 0  , note: $CMD is echoed to shell
OUTPUT=eval "$CMD"  # "", ec 127, note: command not found
OUTPUT=eval $($CMD) # "", ec 127, note: command not found
OUTPUT=$("$CMD")    # "", ec 127, note: command not found
OUTPUT=`$CMD`       # "echo 'a*b*c' | cut -d '*' -f 2", ec 0
OUTPUT=$($CMD)      # "echo 'a*b*c' | cut -d '*' -f 2", ec 0
OUTPUT="$($CMD)"    # "echo 'a*b*c' | cut -d '*' -f 2", ec 0
OUTPUT=$CMD         # "echo 'a*b*c' | cut -d '*' -f 2", ec 0
OUTPUT=${CMD}       # "echo 'a*b*c' | cut -d '*' -f 2", ec 0
OUTPUT=${$CMD}      # "", ec 0, note: bad substitution
OUTPUT=${!CMD}      # "", ec 0
TEST=($CMD)
OUTPUT=eval $TEST   # "", ec 0

我确定我错过了其他一些尝试。 bash真的不能执行像在字符串中执行命令这样的基本任务,并且让我捕获输出而没有一些非常难看的黑客攻击(比如将输出重定向到文件并读取它)?

1 个答案:

答案 0 :(得分:5)

当我苦心经历所有这些问题时,我终于想到了一个有效的解决方案,事后看来这很简单:

OUTPUT=$(eval "$CMD")
EXITCODE=$?

由于我已经输入了所有这些并且我自己无法谷歌,我想我会发布这个并让它成为。