web-dev-qa-db-ja.com

bash:-xログをファイルに設定

set -xを含むシェルスクリプトを使用して、詳細/デバッグ出力を取得します。

#!/bin/bash

set -x
command1
command2
...

出力は次のようになります。

+ command1
whatever output from command1
+ command2
whatever output from command2

私の問題は、シェルの出力(set -xが原因)がstderrに送られ、コマンドの出力(command1command2、...)と混合されることです。 (set -xなしで実行されるスクリプトwoudのように)画面に「通常の」出力を表示し、bashの「余分な」出力を個別にファイルに保存してください。

だから私はこれを画面に表示したいと思います:

whatever output from command1
whatever output from command2

そしてこれはログファイルにあります:

+ command1
+ command2

(ログファイルにすべてが揃っている場合も問題ありません)

set -x 2> fileは、setコマンドの出力ではなく、bashの動作を変更するため、明らかに正しい効果がありません。

スクリプト全体でbash 2> fileを使用しても、このシェルで実行されるすべてのコマンドの標準エラーがリダイレクトされるため、正しいことは行われません。したがって、コマンドのエラーメッセージは表示されません。

17
redseven

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
3
redseven

Steeldriver 提供 1つのアプローチ。または、単にSTDERRをファイルにリダイレクトできます:

script.sh 2> logfile

ただし、これはset -xオプションによって作成された出力と生成されたその他のエラーメッセージの両方がファイルに送られることを意味します。 Steeldriverのソリューションは、おそらくあなたが望むものであるset -x出力のみをリダイレクトします。

3
terdon