stderrを失うことなくスクリプト変数をログファイルにリダイレクトする

stderrを失うことなくスクリプト変数をログファイルにリダイレクトする

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活用できます。デフォルト値はです。stderrset -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

関連情報