パイプによる直接出力と標準出力

パイプによる直接出力と標準出力

コマンドの出力をパイプして送信する方法はありますかstdout

たとえば、fortuneフォーチュンクッキーを印刷し、stdout次のコマンドにパイプします。

$ fortune | tee >(?stdout?) | pbcopy 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and
the Ugly)."
(By Matt Welsh)

答え1

tee常に標準出力に書き込みます。標準出力がすでに送信されている端末に加えてコマンドにデータを送信するには、そのコマンドのプロセスオーバーライドを使用します。 (で始まっても、>プロセス置換は標準出力をリダイレクトせず、teeコマンドはそれを引数として扱います。)

fortune | tee >(pbcopy)

答え2

あなたの家:

fortune | tee >(?stdout?) | pbcopy

出力がstdoutに2回書き込まれるので、fortune出力がpbcopy

OSX(およびその他のサポートされているシステム/dev/std{out,err,in})では、次のことを確認できます。

$ echo 1 | tee /dev/stdout | sed 's/1/2/'
2
2

sum2の代わりに2回印刷します。出力が2回移動し、プロセスがパイプによってリダイレクトされるため、これらのすべての出力が実行され、ここで2回表示されます。12teestdoutteestdoutsedsed2

標準エラーなどの他のファイル記述子を使用する必要があります/dev/stderr

$ echo 1 | tee /dev/stderr | sed 's/1/2/'
1
2

または、tty疑似端末を使用して接続を取得します。

$ echo 1 | tee "$(tty)" | sed 's/1/2/'
1
2

zsh設定オプションを使用すると、以下をmultios行う必要はありません。tee

$ echo 1 >/dev/stderr | sed 's/1/2/'
1
2

答え3

cuonglmが言った。

あなたは試してください:

fortune | tee "$(tty)" | pbcopy

tty/dev/pts/99対話型セッション(例:端末)では、実際の擬似端末(例:)として確認する必要があります。またはいいえttyバッチ、at、デーモン。

関連情報