在一行中使用多个命令检查shell脚本的错误

时间:2013-04-04 03:10:20

标签: shell

我正试图在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.代码仍然会成功grepcut。如何将此命令保留在单个变量中,但如果ffprobe命令失败则退出并显示错误?

编辑:如果有的话,我更喜欢非shell特定答案。此外,建议的副本涵盖了类似的情况,但这里唯一可能的选择是创建一个像这样的临时文件:

f=`mktemp`
(ffprobe ...; echo $?>$f) | ...
e=`cat $f` #error in variable e
rm $f

好像是黑客创建临时文件?如果这是唯一的选择,我将如何将其存储在变量中?

1 个答案:

答案 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