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


9

だから私はビデオを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 ]

トリガーされないようです。何故ですか?&&間違ったか、それが何か他のものでしょうか?

回答:


13

そのステートメントに到達できる唯一の方法は、execそれ自体が失敗した場合です。成功した場合、ffmpegコマンドはシェルを完全に置き換えます。(経験上、&&その場合もは失敗するため、まったく到達できません。)exec実行したくない場合は、実行しないでください。


なるほど、そして&&ffmpegコマンドの後は、実際に機能します。この場所で問題がなければ、もう1つ質問があります。ターミナルウィンドウを使用せずにffmpegのstdoutとstderrをどこかに表示する方法はありますか?ゼニティfeのように
tesseract

あなたはそれを$()コンストラクトで変数に取り込んで、その変数をに渡したいでしょうzenity。引用に気をつけろ、とzenityあなたは交換する必要があるので、私の経験ではPangoを使用して<&>&lt;&amp;&gt;それぞれ。
ギーコサウルス

5

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

bashコマンドプロンプトで次のようにexec入力するhelp execと、組み込みのbashの詳細を確認できます。

$ 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.
    [...]

1

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

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


0

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

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

わかりましたが、&&それでも問題はありませんか?
tesseract

はい。そして、維持する意味は何execですか?
jmtd
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.