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にリダイレクトし、呼び出し中に必要なときにのみ読み取ることです。ただし、その出力が使用されない場合は不要な時間損失を意味します。