bash スクリプトで "set -x" を設定するか、実行スクリプトを使用すると、bash -x
標準出力とともにすべての引数が画面に印刷されます。
stderrとstdoutを画面に印刷できますが、出力をset -x
画面に印刷せずにログファイルにリダイレクトできますか?
アイデアはログに得られるすべての情報を含みますが、通常のstdoutとstderrのみを画面に印刷することです。
答え1
user1@mac1:~/tmp$ cat t1.sh
exec 4>shell.log
BASH_XTRACEFD=4
set -x
echo abc
cat ffff
user1@mac1:~/tmp$ bash t1.sh
abc
cat: ffff: No such file or directory
user1@mac1:~/tmp$ cat shell.log
+ echo abc
+ cat ffff
user1@mac1:~/tmp$
答え2
出力はset -x
次のとおりです。たとえば、stderr
リダイレクトを実行する必要があります。stderr
sh -x your_script.sh 2> debug_info.txt
stderr
の出力を通常の出力と区別するには、出力の前に付くという事実をset -x
活用できます。デフォルト値はです。stderr
set -x
$PS4
+
bash -x your_script.bash 2> \
\
>(tee >/dev/null \
>(grep '^\+ ' > set_x_output.txt)\
>(grep -v '^\+ ' > rest_of_sdterr.txt)\
)
通常のstderr
出力の一部がで始まる場合は、デフォルトの+
プレフィックスを変更して変更できますPS4
。
答え3
次のコマンドを使用してリダイレクトを修正しました。
- また、除外する項目を正確に制御できます。
- これは、BASH_XTRACEFDが効果がない4.1より前のbashバージョンでのみ機能します。
exec 2> >(tee -a $LOG_FULL_NAME 2>&1 | grep -v "^+ \|^++ ") 1>&2