Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查一行上有多个命令的shell脚本是否存在错误_Shell - Fatal编程技术网

检查一行上有多个命令的shell脚本是否存在错误

检查一行上有多个命令的shell脚本是否存在错误,shell,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 如果我更

我试图在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

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

问题是,即使
ffprobe
命令失败,
cut
也不会,并返回零exitcode。管道的退出状态是最后一个命令的退出状态,除非您的shell有方法更改此行为以使第一个命令的退出状态返回失败。您可以使用
bash
/
ksh
中的
set-o pipefail
执行此操作:

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

我不这么认为。我更喜欢非特定于shell的答案。我将据此进行编辑。