すべてのコマンドエラー出力を次のファイルにリダイレクトしようとしています。
exec 2>errlog.txt
ただし、上記の行を実行すると、入力にまったく反応しない「凍結」端末が発生します。さらに興味深いのは、リダイレクトされた標準出力を使用するのがうまくexec
機能することです。エラーリダイレクトにどのような問題がありますか?
ベストアンサー1
exec 2>errlog.txt
(または[1]のbash
代わりに)を使用するとksh93
dash
いいえ端末を凍結させます。これは、シェルのプロンプトと入力した文字がエコーされるのを防ぐだけです。
ただし、後で;-)で検索できます。またはを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]手順については、マンページおよび/を参照してください。ECHO
termios(3)
stty echo
stty(1)