我想在bash中执行一个字符串中的命令,并捕获输出和退出代码.
我已经搜索了一下并在这里搜索,但我没有得到明确的结果.该猛砸FAQ#50被称为了很多,在很大程度上是一种居高临下试图从做disuade人.例如,我的一个原因是日志记录,但回显到终端使用的命令set -x不是日志记录,并且复杂命令的输出过多且不直观,当我想要确定我已经记录了我的脚本运行的确切命令时,而不是在未来的某个时刻无法更新的复制和粘贴</rant>.我详细解释这个问题的原因是关于这个主题的大多数问题都被重复关闭,但是执行字符串和捕获输出的具体要求似乎没有被表示出来.
这是一个简化的例子.
CMD="echo 'a*b*c' | cut -d '*' -f 2"
Run Code Online (Sandbox Code Playgroud)
输出应该是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
Run Code Online (Sandbox Code Playgroud)
我确定我错过了其他一些尝试.bash真的无法执行像在字符串中执行命令这样的基本任务,并且让我捕获输出而没有一些非常丑陋的黑客攻击(比如将输出重定向到文件并读取它)?
当我煞费苦心地打理所有这些问题时,我终于想到了一个有效的解决方案,事后看来这很简单:
OUTPUT=$(eval "$CMD")
EXITCODE=$?
Run Code Online (Sandbox Code Playgroud)
由于我已经输入了所有这些并且无法自己谷歌,我想我会发布这个并让它成为现实.
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           1606 次  |  
        
|   最近记录:  |