スクリプトを実行しているユーザーに表示される標準出力を変更せずに、-xオプションを指定してbashスクリプトを実行することで表示される情報を送信する方法はありますか?
これは、頻繁に使用するbashスクリプトで実装したいデバッグ機能です。
大変感謝いたします。
スクリプトを実行しているユーザーに表示される標準出力を変更せずに、-xオプションを指定してbashスクリプトを実行することで表示される情報を送信する方法はありますか?
これは、頻繁に使用するbashスクリプトで実装したいデバッグ機能です。
大変感謝いたします。
回答:
-xからの出力は、stdoutではなくstderrに送られます。しかし、それでも問題になる可能性があります。多くのスクリプトはstderrのコンテンツに機能的に依存し、場合によってはデバッグストリームとstderrストリームを混在させるのが面倒です。
Bashバージョン4.1以降では、別のソリューションが提供されます。BASH_XTRACEFD環境変数を使用すると、デバッグストリームの送信に使用されるファイル記述子を指定できます。これは、ファイルまたはパイプ、またはその他のUNIXの良さです。
# Use FD 19 to capture the debug stream caused by "set -x":
exec 19>/tmp/my-script.log
# Tell bash about it (there's nothing special about 19, its arbitrary)
export BASH_XTRACEFD=19
# turn on the debug stream:
set -x
# run some commands:
cd /etc
find
echo "Well, that was fun."
# Close the output:
set +x
exec 19>&-
# See what we got:
cat /tmp/my-script.log
もう少し手間をかけることで、stdoutやstdinストリームで「ティー」を実行するなど、他のことを行うことができ、それらをデバッグ出力でインターリーブするため、ログがより完全になります。詳細については、https://stackoverflow.com/questions/3173131/redirect-copy-of-stdout-to-log-file-from-within-bash-script-itselfを参照してください。
代替手段に対するこのアプローチの大きな利点は、デバッグ出力をstdoutまたはstderrに挿入することにより、スクリプトの動作を変更するリスクがないことです。
exec 19>&-
か(行)。私の経験では、スクリプトが終了すると自動的に閉じられます。