「bash -x」(デバッグ モード)をソース スクリプトに再帰的に実行するにはどうすればよいですか?

「bash -x」(デバッグ モード)をソース スクリプトに再帰的に実行するにはどうすればよいですか?

Linux のログイン初期化で bash が何をするかをデバッグしようとしています。「bash -x」を実行すると、bash は実行内容を出力しますが、「set -x」のようにソース ファイル内のコマンドは出力しません。初期化が実行されてから呼び出すので、「set -x」は使用できません。「bash -x」は OS X では再帰的に正常に実行されるようですが、これは bash のバージョンによるものかもしれません。

リナックス: 3.2.25

OS X: 3.2.48

以下は Linux での非再帰動作の抜粋です。

bash -l -x -c 'echo 1'
# ... snip ...
+ for i in '/etc/profile.d/*.sh'
+ '[' -r /etc/profile.d/vim.sh ']'
+ '[' '' ']'
+ . /etc/profile.d/vim.sh
+ for i in '/etc/profile.d/*.sh'
+ '[' -r /etc/profile.d/which-2.sh ']'
+ '[' '' ']'
+ . /etc/profile.d/which-2.sh
# ... snip ...

/etc/profile.d/vim.sh がソース化されているのに、そのコマンドが印刷されていないことに注意してください。アップグレードせずに回避策はありますか? これはバージョンの違いが原因ですか?

答え1

set -xルート ファイル (他のすべてのファイルを必要とするファイル) のどこかで機能するはずです。または、[[ !-z "$DEBUG" ]] && set -x各ファイルに のようなものを導入し、 を呼び出しますDEBUG=1 script.sh

答え2

スクリプトをソースするだけで実行はしないので、メイン スクリプトの最初のコマンドは「set -x」にする必要があります。

これで、すべてのソース スクリプトがデバッグで実行されるようになります。スクリプトをソースすると、現在のシェルで実行されることに注意してください。したがって、-x を 1 回設定すると、すべてのソース スクリプトに適用されます。

関連情報