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


14

コマンドの出力をパイプして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)

OSXが手元にないのですが、どうfortune | tee $(tty) | pbcopyですか?
Archemar 2016年

回答:


9

あなたの仮定:

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

andの2代わりに2回出力します。12

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

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

またはtty、接続された疑似端末を取得するために使用します。

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

オプションセットを使用するzshmultios、次のことはまったく必要ありませんtee

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

tee $(tty)または、知っていますかtee /dev/tty
ケンスター2016年

素晴らしい説明、トップSOがすべてに回答します。
マーリン

10

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

fortune | tee >(pbcopy)

これは良い解決策でもあります。
マーリン

0

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

ちょうど試して:

fortune | tee "$(tty)" | pbcopy

tty(のような実際の疑似端末に解決する必要があります/dev/pts/99(つまり、端末で)対話セッションで)、または無TTYバッチで、時とデーモン。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.