パイプを介して接続された3つのコマンドがあるとします。
A | B | C
Bはエラーメッセージをstderrに出力し、いくつかの進捗状況を端末に出力したいと思います。 stderrが端末と同じであれば簡単です。進捗情報をstderrに送信するだけです。しかし、stderrがリダイレクトされるとどうなりますか?
A | B 2>/tmp/file | C
その後、進捗情報を端末に送信したいのですが、エラーメッセージはファイルに送信されます。
これでリダイレクトされていない場合は、stderrが終了した端末を何とか識別できますか?
私の最初の考えは、使用するttyを見つけてtty
開いてそこに書き込むことでした。しかし、tty
B内でtty
say:を呼び出すと、not a tty
これはAとBの間のパイプが原因だと思います。
Perlを使ってこれをやりたいです。
答え1
Linux関連:
echo |perl -e '$p=getppid; `echo foo > /proc/$p/fd/2`'
ここで stderr をリダイレクトすると、 'foo' は端末に印刷されます。
echo |perl -e '$p=getppid; `echo foo > /proc/$p/fd/2`' 2>/dev/null