我正试图在Linux上的shell脚本中捕获失败命令的错误代码。在这种情况下,我的ffprobe命令:
#!/bin/sh
videoduration=$(ffprobe -loglevel error -show_format myfile.avi | grep duration | cut -d= -f2)
if [ $? -ne 0 ]; then
echo "ERROR"
exit 1
fi
echo $videoduration
如果我更改该命令以提供虚假文件名:
#!/bin/sh
videoduration=$(ffprobe -loglevel error -show_format myfile.av | grep duration | cut -d= -f2)
if [ $? -ne 0 ]; then
echo "ERROR"
exit 1
fi
echo $videoduration
此处的错误代码无用,因为从技术上讲,状态代码仍为0.代码仍然会成功grep
和cut
。如何将此命令保留在单个变量中,但如果ffprobe命令失败则退出并显示错误?
编辑:如果有的话,我更喜欢非shell特定答案。此外,建议的副本涵盖了类似的情况,但这里唯一可能的选择是创建一个像这样的临时文件:
f=`mktemp`
(ffprobe ...; echo $?>$f) | ...
e=`cat $f` #error in variable e
rm $f
好像是黑客创建临时文件?如果这是唯一的选择,我将如何将其存储在变量中?
答案 0 :(得分:0)
问题在于即使ffprobe
命令失败,cut
也没有,并返回零exitcode。管道的退出状态是 last 命令的退出状态,除非您的shell具有更改此行为以返回第一个命令的退出状态失败的方法。您可以使用set -o pipefail
/ bash
中的ksh
执行此操作:
$ false | cut -d= -f2; echo $?
0
$ set -o pipefail
$ false | cut -d= -f2; echo $?
1