コマンドの出力をパイプして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)
あなたの仮定:
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
2
と1
ではなく、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
tee
は常に標準出力に書き込みます。標準出力が既に行われている端末に加えてコマンドにデータを送信する場合は、そのコマンドでプロセス置換を使用します。 (>
で始まるにもかかわらず、プロセス置換は標準出力をリダイレクトせず、tee
コマンドはそれをパラメーターとして認識します。)
fortune | tee >(pbcopy)
cuonglmはそれをすべて言った。
ちょうど試して:
fortune | tee "$(tty)" | pbcopy
tty
は、インタラクティブセッション(つまり、ターミナル内)で実際の疑似ターミナル(/dev/pts/99
など)に解決する必要があります。または、バッチ、at、およびデーモンでno tty.