web-dev-qa-db-ja.com

画面に表示したまま標準出力をパイプする方法は? (出力ファイルではなく)

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

簡単な例(echoここで使用するのは、単に説明のためです):

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

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

私は試した
$ echo 'ee' | tee /dev/stdout | fooが、/dev/stdoutへのtee出力がfooにパイプされるため、動作しません

204
gentooboontoo

以下は、POSIX標準に従うことに注意して、Unix/Linuxの実装で動作するソリューションです。 cygwinのような非Unix環境でも動作します。

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などの一部の環境では、使用可能なデバイスを返す tty コマンドがまだある間は/dev/ttyを実装しないことが報告されています。回避策は次のとおりです。

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

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

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

試すべきもう1つのことは:

echo 'ee' | tee >(foo)

>(foo)は、 プロセス置換 です。

59
bmk

一部のシステムでは「/ 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


POSTSCRIPT:「titty」と発音される可能性のある若いセットの場合、「tty」はかつて「teletype」端末の一般的な略語であり、黄色い紙のロールを使用していたしばしば立ち往生する丸いキー。

18
user51527

試してください:

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

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

15
Jan

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

tty

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

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