set -x
set -o xtrace
zshから()のトレース出力をstderr以外のファイル記述子に送信できますか?
同等のものを探しています$BASH_XTRACEFD
または同じ行動を模倣する方法です。
ベストアンサー1
zsh 5.7以降、答えは「いいえ」です。トレース出力は常に stderr に送信されます。
ソース:ソースを読んでください。トレース出力はxtrerr
有望と思われるファイルに書き込まれますが、唯一の割り当てはxtrerr
to stderr
、対応するコピー、またはtoですNULL
。
動的にロード可能なモジュール設定を作成することは可能ですxtrerr
が、zshソースツリーの外側にモジュールを作成するのは簡単ではありません。
考えられる解決策の1つは、次のものを使用することxtrace
です。DEBUG
罠。ほとんどの場合、これは同じ基本情報を提供しますが、xtrace
完全にシミュレートするのは難しいか不可能な特別なケースがたくさんあると確信しています。 1つの違いは、オプションの継承とxtrace
トラップの継承が機能、サブシェルなどに関連する場合によって異なる規則に従うことです。emulate
概念の証拠:
trap 'print -r -- "+$0:$LINENO>$ZSH_DEBUG_CMD" >>trace_file' DEBUG
あるいは、もう少し複雑になるかもしれません(テストされていません)。
zmodload zsh/system
sysopen -a -o create -u xtrace_fd trace_file
trap 'syswrite -o $xtrace_fd "+$0:$LINENO>$ZSH_DEBUG_CMD"' DEBUG