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


10

Linuxのログイン初期化時にbashが何を行うかをデバッグしようとしています。「bash -x」は、bashが実行していることを出力することを読みましたが、「set -x」のようにソースファイル内のコマンドを出力しません。「set -x」を使用することはできません。呼び出す前に初期化が実行されるためです。"bash -x"はOS Xでは正常に再帰するようですが、bashのバージョンが原因である可能性があります。

Linux: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


ルートファイルはどこにありますか?プラットフォームに依存していませんか?
ケルビン

「ルートファイル」とは、シェルで呼び出しているファイルを意味し、他のファイルをインポートしています。私の例では、ルートファイルはscript.sh
mkaito

1
ただし、bashログインの初期化は、スクリプトが実行される前に行われます。スクリプトで "set -x"を実行するには遅すぎます。自分で試してみてください-"bash -l -x script.sh"を実行してください。スクリプトのコマンドが実行される前に、何かが起こっていることがわかります。
ケルビン

なぜ地球上でスクリプトを実行するのbash -lですか?これはインタラクティブなシェルを対象としています。スクリプトはインタラクティブなシェルではありません。
mkaito 2012

3
もう少しオープンマインドになってください-明らかにbashの作成者はそれが便利だと思っていました。(少なくとも)2つの使用法があります。1)実行しssh user@host 'bash -l -c command'て適切な環境変数をロードします。2)あなたは、システム管理者だとしたいトラブルシューティングスクリプトがやっているinitのものを前に、あなたのスクリプトの実行- bash -l -xあなたが表示されます。env変数が設定されている場所を知りたい場合があります。
ケルビン

0

スクリプトを調達して実行していないため、メインスクリプトの最初のコマンドは "set -x"である必要があります

これで、すべてのソーススクリプトがデバッグで実行されます。スクリプトをソースするときは、現在のシェルで実行されるので、-xを1回設定すると、すべてのソーススクリプトに適しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.