set -x
を含むシェルスクリプトを使用して、詳細/デバッグ出力を取得します。
#!/bin/bash
set -x
command1
command2
...
出力は次のようになります。
+ command1
whatever output from command1
+ command2
whatever output from command2
私の問題は、シェルの出力(set -x
が原因)がstderrに送られ、コマンドの出力(command1
、command2
、...)と混合されることです。 (set -x
なしで実行されるスクリプトwoudのように)画面に「通常の」出力を表示し、bashの「余分な」出力を個別にファイルに保存してください。
だから私はこれを画面に表示したいと思います:
whatever output from command1
whatever output from command2
そしてこれはログファイルにあります:
+ command1
+ command2
(ログファイルにすべてが揃っている場合も問題ありません)
set -x 2> file
は、setコマンドの出力ではなく、bashの動作を変更するため、明らかに正しい効果がありません。
スクリプト全体でbash 2> file
を使用しても、このシェルで実行されるすべてのコマンドの標準エラーがリダイレクトされるため、正しいことは行われません。したがって、コマンドのエラーメッセージは表示されません。
1年以上後、画面に「通常の」出力(stdout + stderr-bash trace)とファイル(bd.log)にすべて(stdout + stderr + bash trace)を含める正しいソリューションを見つけました。 :
exec > >(tee -ia bash.log)
exec 2> >(tee -ia bash.log >& 2)
exec 19> bash.log
export BASH_XTRACEFD="19"
set -x
command1
command2
Steeldriver 提供 1つのアプローチ。または、単にSTDERRをファイルにリダイレクトできます:
script.sh 2> logfile
ただし、これはset -x
オプションによって作成された出力と生成されたその他のエラーメッセージの両方がファイルに送られることを意味します。 Steeldriverのソリューションは、おそらくあなたが望むものであるset -x
出力のみをリダイレクトします。