web-dev-qa-db-ja.com

パイプと標準出力への直接出力

コマンドの出力をパイプしてstdoutに送る方法があるかどうか疑問に思っていました。したがって、たとえば、fortuneはフォーチュンクッキーを出力し、それをクリップボードにコピーします。

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

あなたの仮定:

fortune | tee >(?stdout?) | pbcopy

fortune出力は標準出力に2回書き込まれるため、機能しません。そのため、出力を2倍にしてpbcopyにします。

OSX(および他のシステムが/dev/std{out,err,in}をサポート)では、次のようにして確認できます。

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

21ではなく、2を2回出力します。

他のファイル記述子を使用する必要があります。/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
9
cuonglm

teeは常に標準出力に書き込みます。標準出力が既に行われている端末に加えてコマンドにデータを送信する場合は、そのコマンドでプロセス置換を使用します。 (>で始まるにもかかわらず、プロセス置換は標準出力をリダイレクトせず、teeコマンドはそれをパラメーターとして認識します。)

fortune | tee >(pbcopy)

cuonglmはそれをすべて言った。

ちょうど試して:

fortune | tee "$(tty)" | pbcopy

ttyは、インタラクティブセッション(つまり、ターミナル内)で実際の疑似ターミナル(/dev/pts/99など)に解決する必要があります。または、バッチ、at、およびデーモンでno tty.

0
Archemar