Bashスクリプトで実行された最後の行を簡単に見つける方法はありますか?

Bashスクリプトで実行された最後の行を簡単に見つける方法はありますか?

何千回も実行されるforループを含むbashスクリプトを実行しています。このforループのどこかでコードが頻繁に停止することがあります。 (私が見た最も低い反復は32回で、ほとんどは4000回程度で停止します。コードは5000回実行する必要があり、時にはタスクを完了することもあります。)この問題をデバッグしたいと思います。明らかに、コマンドウィンドウに数十万行のコードを手動で入力し、停止するのを待ちたくありません。

最後に実行したか実行しようとした行が何であるかを見つける簡単な方法はありますか? (何かが間違っていると、端末が停止しているように見えます。時にはシステム全体が動作を停止して再起動するためにリモートリセットが必要になることに注意してください。)これはechoの機能かもしれないと思いました。私が見つけたこの質問と回答しかし、「コマンドがパーサーの観点からスクリプトの特定の行を表す場合」が何を意味するのかわかりません。したがって、適用される場合です。また、このコードが実際に何をしているのかは非常に混乱しています。このコードが役立つ場合はありがとうございます。

これが私が探している答えですか?この問題に対する他の解決策はありますか?

ベストアンサー1

まず、問題が発生する繰り返しを確認する必要があります。運が良ければいつも同じです。とにかくそうしない場合は、繰り返し回数を数えて印刷するか、ファイルに書き込む必要があります。

exec 3>/my/logfile
iter=0
while whatevercondition; do
  ((iter++))
  echo "$iter" >&3
done

同じ繰り返しで問題が常に発生する場合は、デバッグ出力を有効にしてから次の操作を行う必要があります。

CRASH_ITER=12345
iter=0
while whatevercondition; do
  ((iter++))
  if [ "$iter" -eq "$CRASH_ITER" ]; then
    set -vx
  fi
done

再現不可能なエラー

エラーを特定の反復に絞り込むことができない場合は、bashにデバッグ出力全体をファイルに書き込むことができます。

bash -vx ./script.sh 2>debug.txt

おすすめ記事