execコマンドの戻りコードをキャプチャしようとしていますが、コマンドが実行されると、次の行に進むことなくスクリプトが終了します。
exec /bin/sh -c $command > log.txt
rc=$?
if [ $rc -ne 0 ]; then echo "script failed"; exit 999 ; fi
「exec」コマンドを実行し、次の行セットを実行し続ける方法の提案
答え1
exec
コマンドを引数として使用すると、プロセスで実行されている現在のプログラムが指定されたコマンドに変わるため、呼び出すシェルスクリプトの観点からは、要求されたexec
コマンドを実際に実行できなくても返されません。
あなたのシナリオでは、おそらく以下を削除する必要がありますexec
。
/bin/sh -c " $command" > log.txt
rc=$?
if [ "$rc" -ne 0 ]; then echo>&2 "script failed"; exit 99; fi
また、忘れた引用符$command
で$command
終わらないように先行スペースを記録し、-
エラー>&2
がstderrに送信されることを確認してください。
255を超える値は指定されていない結果を生成するため、エラーコードが999から99に変更されました。
ポイントは、$command
現在のシェルが保存されているシェルコードを解釈することである場合は、次のことができますeval
。
eval " $command" > log.txt
rc=$?
if [ "$rc" -ne 0 ]; then echo>&2 "script failed"; exit 99; fi
またはより良い:
if ! eval " $command" > log.txt; then
echo>&2 "script failed"
exit 99
fi
POSIXではとも呼ばれますsh
。eval
特別な> log.txt
コードに構文エラーがある場合やリダイレクトが失敗するなど、組み込み関数が失敗した場合でも終了が必要です。この場合、script failed
エラーは出力されません。この問題は次の方法で解決できます。
if ! command eval " $command" > log.txt; then
echo>&2 "script failed"
exit 99
fi
command
プレフィックスを削除する場所詳細次の特殊な組み込みコマンドに適用されます。
zsh
シミュレーション中でないと使用できませんsh
。