1. ホーム
  2. バッシュ

[解決済み】画面に表示したままstdoutをパイプする方法は?(出力ファイルには出力しない)

2022-04-03 10:03:23

質問

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

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

$ echo 'ee' | foo

ee <-私が見たいと思う出力

teeが標準出力をファイルにコピーできることは知っていますが、それは私が欲しいものではありません。

$ echo 'ee' | tee output.txt | foo

試してみた

$ echo 'ee' | tee /dev/stdout | foo に出力されますが、うまくいきません。 /dev/stdout はパイプで foo

解決方法は?

ここでは、どのような Unix / Linux 実装でも動作する解決策を紹介します。 POSIX 規格に準拠しています。のような非Unix環境でも動作します。 cygwin もあります。

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

参考 The Open Group基本仕様書第7号 IEEE Std 1003.1、2013年版、§10.1 :

/dev/tty

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

Google Colabのような一部の環境では、実装されていないことが報告されています。 /dev/tty を持つ一方で tty コマンドは、使用可能なデバイスを返します。以下は、その回避策です。

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

または古代のBourneシェルで。

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