web-dev-qa-db-ja.com

bash stdout / stderrを2つの場所にリダイレクトしますか?

これはしばらくの間私を悩ませてきました。 stdoutstderrを端末出力の両方にプログラムにリダイレクトすることは可能ですか?

出力をファイルにリダイレクトし、 stdout を使用してteeにリダイレクトできることは理解していますが、プログラム(私のエディター[TextMate])に送信したいです。ターミナル出力と同様に…確かにこれは可能です(私はzshでそれが可能であることを知っています…)

34
obeattie

名前付きパイプを使用できます。これは、説明した状況を正確に対象としています。

mkfifo some_pipe
command_that_writes_to_stdout | tee some_pipe \
  & command_that_reads_from_stdin < some_pipe
rm some_pipe

または、Bashでは:

command_that_writes_to_stdout | tee >(command_that_reads_from_stdin)
31
JasonSmith

Stdoutとstderrを端末出力とプログラムの両方にリダイレクトすることは可能ですか?

エディターへの入力でstdoutとstderrを組み合わせることがどれほど役立つかはわかりませんが、このようなもので必要なことはできますか?

input_prog 2>&1 | tee /dev/tty | my_editor
20
CB Bailey

TextMateがファイルを標準入力として編集できるかどうかは実際にはわかりませんが、少し奇妙に思えます。 stdout/stderrをファイルに送信し、そこで編集することをお勧めします。その場合は、次のものが必要です。

progname 2>&1 | tee tempfile ; textmate tempfile

2>&1stderr(ファイルハンドル2)をstdout(ファイルハンドル1)と同じ場所にリダイレクトして、両方が1つのストリームになるようにします。次に、teeコマンドはそれをtempfilestdoutに書き込みます。

次に、プロセスが終了すると、一時ファイルでエディターが呼び出されます。

編集用の標準入力を受け入れることができる場合は、次を使用します。

progname 2>&1 | tee /dev/tty | textmate
2
paxdiablo