我想在 bash 中执行一个字符串中的命令,并捕获输出和退出代码。
我在谷歌上搜索了一下,并在此处进行了搜索,但没有得到明确的结果。 Bash FAQ #50被提及很多,主要是一种居高临下的尝试,试图劝阻人们不要这样做。例如,我的原因之一是记录日志,但使用 set -x
将命令回显到终端没有记录,复杂命令的输出过多且不直观,而我只想确定我已经记录了我的脚本运行的确切命令,而不是在某些时候无法更新的复制和粘贴在路上</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 真的不能执行这样的基本任务,例如在字符串中执行命令并让我在没有一些非常丑陋的黑客攻击(比如将输出重定向到文件并读取它)的情况下捕获输出吗?
最佳答案
当我煞费苦心地输入所有这些问题时,我终于想到了一个可行的解决方案,事后看来这很简单:
OUTPUT=$(eval "$CMD")
EXITCODE=$?
因为我已经把所有这些都打出来了,而且我自己也无法用谷歌搜索,所以我想我就把它贴出来吧。
关于Bash:在字符串中执行复杂命令,捕获输出并返回代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42965335/