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

标签 bash shell

我想在 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/

相关文章:

bash - 使用 awk 提取列中范围的行

bash - 如何在vim中执行命令?

linux - 在 bash 脚本中,count1 = `cat $affected_ip|wc -l` ;echo $count1;

python - Pyspark 将数据写入配置单元

linux - 我想通过命令行向 python 传递一个参数

linux - bash 脚本 : how to get item name on a radiolist using dialog

bash - 使用 diff 忽略新行和括号样式

linux - 按第二字段和第三字段的乘积排序(Linux)

linux:将用户提示重定向到/dev/null

bash - Shell脚本对编码和行尾敏感吗?