0

Linux のシェル スクリプトで失敗したコマンドのエラー コードをキャッチしようとしています。この場合、私の 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 コマンドが失敗した場合にエラーで終了するにはどうすればよいですか?

編集:もしあれば、非シェル固有の回答を好むでしょう。また、提案された複製は同様のケースをカバーしていますが、ここで唯一の潜在的なオプションは次のような一時ファイルを作成することです:

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

一時ファイルを作成するハックのようですか?これが唯一のオプションである場合、これを変数にどのように格納しますか?

4

1 に答える 1

0

問題は、ffprobeコマンドが失敗しても、 が失敗cutせず、ゼロの終了コードを返すことです。パイプの終了ステータスは、最初のコマンドの終了ステータスを返すようにシェルがこの動作を変更して失敗した場合を除き、最後のコマンドの終了ステータスです。set -o pipefailin bash/でこれを行うことができますksh

$ false | cut -d= -f2; echo $?
0
$ set -o pipefail 
$ false | cut -d= -f2; echo $?
1
于 2013-04-04T07:15:26.923 に答える