
だから私はビデオを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コマンドプロンプトで次のように入力すると、exec
bashの組み込み機能の詳細が表示されます。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") &&