1. ホーム
  2. bash

[解決済み] Bashスクリプトをデバッグするにはどうしたらいいですか?[クローズド]

2022-04-24 10:19:35

質問

Bashスクリプトをデバッグする方法はありますか?

例えば、"1行目の呼び出し"、"2行目の呼び出し"など、一種の実行ログを表示するようなものです。

どのように解決するのですか?

sh -x script [arg1 ...]
bash -x script [arg1 ...]

これらは、何が実行されたかを追跡することができます。 (回答の最後のほうにある「明確化」も参照してください)。

時には、スクリプト内でデバッグを制御する必要があります。 その場合、以下のように チートス 思い出す を、使ってください。

set -x

これでデバッグがONになります。 その後で再びオフにすることができます。

set +x

(を解析することで、現在のトレース状態を知ることができます)。 $- の場合、現在のフラグは x .)

また、シェルでは一般的にオプションとして ' -n は「実行しない」、' -v これらを組み合わせて使うことで、シェルがスクリプトを実行できると考えているかどうかを確認することができます。


という議論がありますが、' -x のオプションは他のシェルとは異なります(コメント参照)。 その Bashマニュアル にはこう書かれています。

  • -x

    簡単なコマンドのトレースを表示します。 for コマンドを使用します。 case コマンドを使用します。 select コマンド、および算術 for コマンドとその引数、または関連する単語リストを展開した後、実行する。の値は PS4 変数が展開され、その結果がコマンドと展開された引数の前に表示されます。

それだけでは、全く異なる挙動を示しているようには見えません。 他に関連する言及がないのは、' -x がマニュアルに記載されています。 起動シーケンスの違いについては記載されていません。

明確化 : 典型的なLinuxボックスのようなシステムで、' /bin/sh ' へのシンボリックリンクです。 /bin/bash (またはBashの実行ファイルがある場所)、2つのコマンドラインは、実行トレースをオンにしてスクリプトを実行するのと同等の効果を達成することができます。 他のシステム(例えば、Solarisや、Linuxのいくつかの最新バージョンなど)では /bin/sh はBashではないので、この2つのコマンドラインは(少し)異なる結果をもたらすでしょう。 最も注目すべきは、' /bin/sh は、Bashが全く認識しない構成要素によって混乱させられるでしょう。 (Solarisでは /bin/sh 最近のLinuxでは、より小さく、より厳密にPOSIXのみのシェルであるDashの場合もあります)。 このような名前で呼び出された場合、「shebang」行(' #!/bin/bash ' 対 '#!/bin/sh ') をファイルの先頭に置いても、その内容の解釈には何の影響もありません。

Bashのマニュアルには BashのPOSIXモード として起動されたBash」の違いについて、詳細に説明しています。 sh と「Bash invoked as bash '.

(Bash)シェルスクリプトをデバッグする場合、shebang行で指定されたシェルを使用することは賢明であり、正気であり、必要でさえあります。 -x オプションで指定します。 そうしないと、デバッグ時とスクリプト実行時で異なる動作になる可能性があります(なります?)。