パイプコマンドでteeを使用すると、奇妙な出力が発生します。

パイプコマンドでteeを使用すると、奇妙な出力が発生します。

私のタスクでは、次のコマンドを使用する必要があります。

who|tee test|wc -l

私のシステムの出力は次のとおりです。これは、2人のユーザーが接続されていることを意味します。

2

なぜwho画面に出力が出ず、出力も出ないのですかwc -ltee出力を画面に記録すると同時に、同じ出力を持つファイルを作成すると思いましたか?

whoしかし、私のファイルでは、テスト「しかし、まだ私には理解できません。

答え1

パイピングの効果は、tee最初のコマンドが何でも記録することです。標準出力ファイル(名前がコマンドライン引数として渡されますtee)とteeコマンドの標準出力に書き込みます。パイプが継続されず、コマンドへのリダイレクトを実行しない場合のtee標準tee出力は、シェル(通常は端末)の標準出力です。

これがrunningwhoとrunningがwho | tee test端末に同じテキストを表示する理由です。あなたとの違いは、teeファイルに書き込むことです。

パイプが継続すると、who | tee test | wc -l端末に書き込まれたすべての標準出力がパイプの次のコマンドに送信されます。これとは異なり、入力を標準出力(または他の場所)にコピーしないwcコマンドです。代わりに統計を表示します。このオプションを使用すると、行数だけが表示されるため、表示されるすべてです。teewc-l

2だからそれだけ見る理由who | tee test | wc -lとそれだけ見る理由は同じだ。このコマンドは出力をファイルに書き込みますが、次の場合を除き、端末に印刷しません。2who | wc -lteewhoそれ標準出力は端子です。これは通常デフォルトで適用されますが、他のコマンドにパイプする場合は適用されません。

|パイプの次のコマンドへの入力として使用されるのではなく、出力がターミナルに表示されるコマンドが左側に表示された場合は、おそらく次のように書いています。標準エラー標準出力の代わりに。

答え2

tee入力をコピーしてファイルに保存し、標準出力。そこから標準出力wc...に移される標準入力のためのwcwcカウントのみが返され、カウントの入力データはエコーされません。

理解したい場合は、cmd1 | tee file | cmd2次のような効果があると考えればいいです。

cmd1 > file
cat file | cmd2

これではありません。実際にしかし、コマンドを実行する人の観点からは同じように見えます(cmd1すべてがほぼ同時に発生するという印象を与えるほど速い場合)。実際にデータを受信しながらデータを入力しますfilecmd2

答え3

二つを同時に見たいwho そして wcdoの出力bash

who | tee >(wc -l) test

出力:

me       tty7         2017-10-16 18:17 (:0)
1

コンテンツを含めるテスト

関連情報