画面に表示したままstdoutをパイプする方法は?(出力ファイルではありません)


234

画面に表示したまま、プログラムの標準出力をパイプ処理したいと思います。

簡単な例を示します(echoここでの使用は単に説明のためです):

$ echo 'ee' | foo
ee <-見たい出力

Teeがstdoutをファイルにコピーできることは知っていますが、それは私が望んでいることではありません。
$ echo 'ee' | tee output.txt | foo

私が試しました
$ echo 'ee' | tee /dev/stdout | fooが、ティー出力/dev/stdoutがパイプされているので機能しませんfoo


6
なおecho 'ee' | tee /dev/stderrので、あなたの場合は作品しかし、「画面上の」やる要件があまりにも標準エラー出力によって満たされます。
nh2

回答:


344

POSIX標準に準拠することを前提として、Unix / Linux実装で機能するソリューションを次に示します。Unix以外の環境でcygwinも動作します。

echo 'ee' | tee /dev/tty | foo

参照: The Open Group Base Specifications Issue 7 IEEE Std 1003.1、2013 Edition、§10.1

/ dev / tty

そのプロセスのプロセスグループに関連付けられています(ある場合)。これは、出力がどのようにリダイレクトされても、端末へのメッセージの書き込みまたは端末からデータの読み取りを確実にしたいプログラムまたはシェルプロシージャに役立ちます入力された出力が必要で、現在使用中の端末を見つけるのが面倒な場合に、出力用のファイル名を要求するアプリケーションにも使用できます。各プロセスでは、制御端末の同義語

Google Colabのような一部の環境は、使用可能なデバイスを返すコマンドが/dev/ttyまだある間は実装されないことが報告されていttyます。これは回避策です:

tty=$(tty)
echo 'ee' | tee $tty | foo

または古代のボーンシェル:

tty=`tty`
echo 'ee' | tee $tty | foo

5
@static_rttiなぜ私のコメントに対する私の返信が毎年無視されているのですか?
jlliagre

1
@PaulBissex /dev/ttyは必須のUnixデバイスです。BSD刑務所で実行していますか?
jlliagre 2016年

1
@PaulBissexこれは実装または構成のバグです。/ devはマウントされていますか?「ls -l / dev / tty / dev / tty * / dev」は何を示していますか?参照lists.freebsd.org/pipermail/freebsd-bugs/2012-November/...は forums.freebsd.org/threads/...
jlliagre

1
そして、次のteeようにカスケードできます:cat some.log | tee /dev/tty | tee -a other.log | grep -i 'foo' >> foo.log1)すべてをコンソールに取得する、2)すべてを別のファイルに追加する、3)foo行を別のファイルに取得する。
ジェシーチザム2017年

1
Google Colabにははありませんが/dev/tty、の出力ttyは使用できます。
トム・ヘイル

69

もう1つ試すことは:

echo 'ee' | tee >(foo)

>(foo)あるプロセス置換


1
fooの出力を別のバーにパイプしたい場合はどうなりますか?
Jack Tang

3
@JackTang-の出力のそれ以上のパイプfooは、プロセス置換の一部である必要があると思います。ここでは例があります:echo 'ee' | tee file.txt >(wc -c | tr -d ' ')
ニック・Chammas

1
これはFreeBSD(/ dev / ttyなし)での私に対する解決策でした
Paul Bissex

9
@Nick Chammas、通常のパイプラインを維持するには、teeの出力を交換できますecho 'ee' | tee >(cat) | foo | bar
Vaelus 2017年

18

一部のシステムでは「/ dev / stdout」へのアクセスが拒否されていますが、ユーザー端末へのアクセスは「/ dev / tty」によって与えられます。「foo」の代わりに「wc」を使用すると、上記の例は(linux、OSXなどで)次のように正常に動作します。

% echo 'Hi' | tee /dev/tty | wc Hi 1 1 3

一致するファイルのリストの一番下にカウントを追加するには、次のようにします。
% ls [A-J]* | tee /dev/tty | wc -l

これらすべてを覚える必要がないように、エイリアスを定義します。
% alias t tee /dev/tty
% alias wcl wc -l

私が簡単に言うことができるように:
% ls [A-J]* | t | wcl


後書き:「titty」として発音をこねる若いセットの場合、「tty」はかつて「teletype」端末の一般的な省略形であり、黄色い紙のロールを使用し、丸いキーがよくあったため、立ち往生。


17

試してください:

$ echo 'ee' | tee /dev/stderr | foo

もちろん、stderrの使用がオプションの場合。


8

最初に、画面に関連付けられている端末(または出力を表示する画面)を把握する必要があります。

tty

次に、出力をそのターミナルにティーし、他のコピーをfooプログラムにパイプします。

echo ee | tee /dev/pty/2 | foo

1
ワンライナー:t = $(tty)echo ee | ティー$ t | foo | バー
Jack Tang

5
@JackTangそれtは確かに良いですが、役に立たないです。使用することはできますecho ee | tee $(tty) | footty、実際/dev/ttyには機能するので、コマンド()は無用です。
jlliagre 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.