このbashスクリプトでコマンドの終了値を取得できないのはなぜですか?

このbashスクリプトでコマンドの終了値を取得できないのはなぜですか?

だから私はビデオをmp3にトランスコードするために、次のような小さなノーチラススクリプトを書いています。

#! /bin/bash -x

if [ -z "$1" ]
    then
    zenity --warning --text="Error - No file selected !"
    exit 1
fi

BASEFILENAME=${1%.*}

exec ffmpeg -i "$1" -ab 256k "$BASEFILENAME.mp3" &&

if [ "$?" -eq 0 ]
    then
    zenity --info --text="Converting successful"
    exit
fi

問題はffmpegコマンドが正常に実行されましたが、if [ "$?" -eq 0 ]

発動しないようです。なぜそんなことですか?&&間違いですか、それとも別のものですか?

答え1

このドアに到達する唯一の方法は、ドアexec自体が失敗した場合です。成功すると、ffmpegコマンドはシェルを完全に置き換えます。 (現象的&&にはこの場合でも失敗するため、まったく到達できません。)execこれを実行したくないので、実行してください。

答え2

このexec commandステートメントは現在のシェルをに置き換えますcommand。つまり、スクリプトは実際に行で終了します。これは、そのコマンドがPATHにない場合、または他の理由で起動できないexec ffmpeg ...場合にのみ発生します。ffmpeg

bashコマンドプロンプトで次のように入力すると、execbashの組み込み機能の詳細が表示されます。help exec

$ help exec
exec: exec [-cl] [-a name] [command [arguments ...]] [redirection ...]
    Replace the shell with the given command.

    Execute COMMAND, replacing this shell with the specified program.
    ARGUMENTS become the arguments to COMMAND.  If COMMAND is not specified,
    any redirections take effect in the current shell.
    [...]

答え3

これによると execシェルを指定したコマンドで置き換えます。したがって、あなたのスクリプトは決して到着しませんexec

あなたは必要ありませんexec。コマンドを指定するだけです。

答え4

execコマンドをサブシェルに入れると、コマンドを保存できます。

- exec ffmpeg -i "$1" -ab 256k "$BASEFILENAME.mp3" &&
+ (exec ffmpeg -i "$1" -ab 256k "$BASEFILENAME.mp3") &&

関連情報