プログラムを画面に表示したまま、プログラムの標準出力をパイプで送信したいと思います。
簡単な例(echo
ここで使用するのは、単に説明のためです):
$ echo 'ee' | foo
ee
<-見たい出力
Teeがstdoutをファイルにコピーできることは知っていますが、それは私が望むものではありません。$ echo 'ee' | tee output.txt | foo
私は試した$ echo 'ee' | tee /dev/stdout | foo
が、/dev/stdout
へのtee出力がfoo
にパイプされるため、動作しません
以下は、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
一部のシステムでは「/ 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」端末の一般的な略語であり、黄色い紙のロールを使用していたしばしば立ち往生する丸いキー。
試してください:
$ echo 'ee' | tee /dev/stderr | foo
もちろん、stderrの使用がオプションの場合。
最初に、画面(または出力を表示する画面)に関連付けられた端末を把握する必要があります。
tty
次に、出力をそのターミナルにティーし、他のコピーをfooプログラムにパイプします。
echo ee | tee /dev/pty/2 | foo