'exec' はスクリプトを終了し、次のステップを続行しません。

'exec' はスクリプトを終了し、次のステップを続行しません。

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ではとも呼ばれますsheval特別な> log.txtコードに構文エラーがある場合やリダイレクトが失敗するなど、組み込み関数が失敗した場合でも終了が必要です。この場合、script failedエラーは出力されません。この問題は次の方法で解決できます。

if ! command eval " $command" > log.txt; then
  echo>&2 "script failed"
  exit 99
fi

commandプレフィックスを削除する場所詳細次の特殊な組み込みコマンドに適用されます。

zshシミュレーション中でないと使用できませんsh

関連情報