2013-04-04 40 views
0

我试图在Linux上的shell脚本中捕获失败命令的错误代码。在这种情况下我ffprobe命令:在一行上检查与多个命令的shell脚本错误

#!/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命令失败,则会退出并显示错误消息?

编辑:我更喜欢非壳特定的答案,如果有的话。另外,建议重复涵盖了类似的情况,但这里的唯一潜在的选择是创建一个临时文件,像这样:

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

看起来像一个黑客创建一个临时文件?如果这是唯一的选择,我将如何将它存储在一个变量?

+0

我不这么认为。我更喜欢非特定于shell的答案。我会相应地编辑。 – Tom 2013-04-04 03:40:50

回答

0

问题是,即使ffprobe命令失败,cut也不会,并返回零退出码。管道的退出状态是最后一个命令的退出状态,除非您的shell有办法更改此行为以使第一个命令的退出状态返回失败。您可以在bash/kshset -o pipefail做到这一点:

$ false | cut -d= -f2; echo $? 
0 
$ set -o pipefail 
$ false | cut -d= -f2; echo $? 
1 
相关问题