set -x 出力をキャプチャするために bash スクリプトの一部をファイルにリダイレクトする

set -x 出力をキャプチャするために bash スクリプトの一部をファイルにリダイレクトする

bashスクリプトがあり、set -xを使用してスクリプトの一部をキャプチャし、その出力をファイルにリダイレクトしたいと思います。

ENVFILE設定は表示できますが印刷されます。

set -xの出力をstd outの代わりにファイルにキャプチャする方法はありますか?

#!/bin/sh
...a bunch of stuff....

if [ -e ${ENVFILE} ]; then
set -x
. ${ENVFILE}
set +x
fi # ! -e PROJOB
... a bunch of stuff .... 

答え1

bashを使用している場合は、次のものを使用できます。BASH_XTRACEFD:

...
if [ -e ${ENVFILE} ]; then
  BASH_XTRACEFD=3
  set -x
  . ${ENVFILE}
  set +x
  unset BASH_XTRACEFD
fi # ! -e PROJOB
...

次に、次のようにスクリプトを実行します。

/path/to/script 3>/path/to/trace.output

すでにFD 3を使用している場合は、3以外のファイル記述子を使用してください。

答え2

私はこれをします。コードのコメントを見てください。

#!/bin/sh
...a bunch of stuff....

if [ -e ${ENVFILE} ]; then

#save the file descriptor of the current stderr
exec 3>&2
#redirect to the file
exec 2>/.../you_file

set -x
. ${ENVFILE}
set +x

#restore original redirection
exec 2>&3
#close file descriptor 3
exec 3>&-

fi # ! -e PROJOB
... a bunch of stuff .... 

デバッグ内容の横に標準出力をリダイレクトするには、fd 2と同様にファイル記述子1をリダイレクトする必要がありますexec

関連情報