stdout を画面上に表示したままパイプするにはどうすればよいでしょうか? (出力ファイルには出力しません) 質問する

stdout を画面上に表示したままパイプするにはどうすればよいでしょうか? (出力ファイルには出力しません) 質問する

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

簡単な例(echoここでの使用は説明目的のみです):

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

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

試してみましたが、Tee出力がパイプされている
$ echo 'ee' | tee /dev/stdout | fooため動作しません/dev/stdoutfoo

ベストアンサー1

これは、標準に準拠していると仮定して、あらゆる Unix / Linux 実装で機能するソリューションですPOSIX。また、一部の非 Unix 環境でも機能しますcygwin

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

参照:オープングループ基本仕様第7版IEEE Std 1003.1、2013年版、§10.1:

/dev/tty

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

Google Colabのような一部の環境では/dev/ttyttyコマンドは使用可能なデバイスを返します。回避策は次のとおりです。

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

または古い Bourne シェルを使用する場合:

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

おすすめ記事