デバッグおよびパイプライン出力(ロギング、メトリックなど)のための追加のファイル記述子

デバッグおよびパイプライン出力(ロギング、メトリックなど)のための追加のファイル記述子

Bashスクリプトプロジェクトの場合は、人間が読めるログメッセージをstdout / stderrに書き込みます。また、デフォルトでは削除されますが、パイプライン処理のためにリダイレクトできる3番目のストリームにフォーマットされた指標を書きたいと思います。これには追加のファイル記述子を使用することをお勧めしますか?

exec 3> /dev/null
echo "This is stdout"
echo "This is stderr" >&2
echo "This is fd3" >&3

通常の状況では、3行目が表示されないことに同意します。しかし、特定のツールチェーン内で使用されるときにこれらのメッセージをパイプしたいと思います。簡単な例:

$ bash example.sh 3>&1
This is stdout
This is stderr

3行目はコンソール出力として表示されません。

私は何が間違っていましたか?これには回避策がありますか?他に推奨されるアプローチがありますか?

ベストアンサー1

Fd 3は/dev/null最初の行にバインドされているので、3番目のEchoは必然的に標準出力を/dev/null

代わりにFd3があることを確認して、Fd3が割り当てられていることを確認してください/proc/self/fd/3。それ以外の場合はバインドしてください/dev/null。その場合はそのままにしてください。

[ -e /proc/self/fd/3 ] || exec 3> /dev/null
echo "This is stdout"
echo "This is stderr" >&2
echo "This is fd3" >&3
$ ./example.sh 3>&1
This is stdout
This is stderr
This is fd3
$ ./example.sh
This is stdout
This is stderr

3番目のEchoが実際に多くの出力を作成するコマンドである場合、Fd 3がオンになっているときにのみコマンドをトリガーする方が効率的な選択肢になります。

echo "This is stdout"
echo "This is stderr" >&2
[ -e /proc/self/fd/3 ] && echo "This is fd3" >&3

もう1つの可能性は、常にFd 3を介してファイルまたはFIFOにリダイレクトし、呼び出し中に必要なときにのみ読み取ることです。ただし、その出力が使用されない場合は不要な時間損失を意味します。

おすすめ記事