次のコマンドを解釈しようとしますtee
。
cat colors.txt words.txt | tee colorsAndWords.txt | wc
次の理解は正しいですか?
cat colors.txt words.txt
colors.txt
:このコマンドはファイルの内容を連結し、結合されたwords.txt
出力を標準出力(ターミナル)に送信します。| tee colorsAndWords.txt
:(|
パイプ)表記は前のコマンドの出力を取得し、コマンドの入力に渡しますtee
。tee
標準出力(通常は端末)にデータを表示し、ファイルに書き込むために使用されます。この例では、接続された出力をcolorsAndWords.txt
。| wc
:finalは| wc
コマンドの出力tee
と接続内容を取得してコマンドに渡しますwc
。wc
入力として受け取ったテキストの行、単語、および文字数を計算するために使用されます。
答え1
あなたの理解は正しいです。必要はありません。正しい実用性についてtee
。使用されますデータフローのコピー、あなたが示した例は、ファイルにコピーを保存すると同時に、パイプラインの次のステップに渡すことです。
それ基準ユーティリティは、Linuxだけでなく、すべてのUnixシステムで同じように動作することを意味します。標準仕様ここで発見、Linuxなどで見つかった実装はこの説明に従う必要があります(ただし、新しいコマンドラインオプションなどの拡張機能を追加できます)。
答え2
はい、そうです。 tee
水道管のTジャンクションやデュアル出力ヘッドホンジャックスプリッタと同じです。入力を読み込み、2つの出力ファイル(stdoutとコマンドラインで指定されたファイル)にコピーします。 (実際には出力ファイルの数に制限はありません。コマンドラインで複数の出力ファイルを指定できます。この答えの残りの部分では、引数が1つの単純な場合を想定しています。)
おそらく、これは作成方法を理解するのに役立ちますtee
。
Cでは、ループ本体は次のようになります。
ssize_t bytes_read = read(0 /*stdin*/, buf, 4096);
write(1 /*stdout*/, buf, bytes_read); // error checking not shown; also
write(cmdline_arg_output_fd, buf, bytes_read); // loops to finish short writes
ループ条件は、while(bytes_read > 0)
EOF(読み取り戻り0)またはエラー(負)をキャプチャするのと似ており、while( (bytes = read()) > 0 )
式内の割り当てと比較を制御するのと似ています。戻り値を確認する必要があるため今後書き込み電話をかけます。
そのサイクルの前でもfd = open(argv[1], O_WRONLY|O_CREAT, 0666);
何でも。
興味深い用途は、foo | bar | tee /dev/tty | baz
パイプラインの対応するステップを通過するデータを表示するための「デバッグ印刷」です。 (/dev/tty
プロセスを制御するために実際にTTYを提供するデバイスを開くのは端末です。Konsole /dev/pts/19
Terminalタブと同じです。)
他の有用なパラメータは、使用中の一般的なファイル、名前付きパイプ、または>( grep ... > filtered.txt)
。
答え3
'|'パイプ文字は、これら3つのプログラム(cat、tee、およびwc)を非常に特定の方法で実行する必要があるというシェルのコマンドです。
彼らは基本的にstdout(この場合はcatとtee)が端末自体以外のものにリダイレクトされることを認識していません。
teeとwcプログラムの標準入力でも同様です。