execを使用したstderrリダイレクト

execを使用したstderrリダイレクト

すべてのコマンドエラー出力を次のファイルにリダイレクトしようとしています。

exec 2>errlog.txt

ただし、上記の行を実行すると、入力にまったく反応しない「凍結」端末が発生します。さらに興味深いのは、リダイレクトされた標準出力を使用するのがうまくexec機能することです。エラーリダイレクトにどのような問題がありますか?

ベストアンサー1

exec 2>errlog.txt

(または[1]のbash代わりに)を使用するとksh93dashいいえ端末を凍結させます。これは、シェルのプロンプトと入力した文字がエコーされるのを防ぐだけです。

ただし、後で;-)で検索できます。またはをerrlog.txt盲目的に入力して簡単に確認できます。このコマンドは正常に動作し、出力を表示します。また、^C と ^Z も期待どおりに機能します。pwd<Enter>ls<Enter>

これには2つのタスクがあります。

1)bash常にプロンプ​​トを制御端末ではなく stderr に印刷します。

2)コマンドライン編集を実装するためにbashが使用するreadlineライブラリは、ターミナル[2]のエコーフラグをオフにし、ユーザーが入力した文字をstderrに印刷します。

bashシェルを起動するとbash --noediting(readlineライブラリを使用しなくなります)、入力した文字はttyドライバによってエコーされ、プロンプトだけがリダイレクトされたstderrに移動します。

この問題に対する解決策は、teeプロセス置換を使用することです。

exec 2> >(trap '' INT; tee errlog.txt >/dev/tty)

[1]参照こここれにより、一部のシェルがひどくクラッシュする理由と期待どおりに機能する理由を説明しますzsh

c_lflag[2]手順については、マンページおよび/を参照してください。ECHOtermios(3)stty echostty(1)

おすすめ記事