私のタスクでは、次のコマンドを使用する必要があります。
who|tee test|wc -l
私のシステムの出力は次のとおりです。これは、2人のユーザーが接続されていることを意味します。
2
なぜwho
画面に出力が出ず、出力も出ないのですかwc -l
?tee
出力を画面に記録すると同時に、同じ出力を持つファイルを作成すると思いましたか?
who
しかし、私のファイルでは、テスト「しかし、まだ私には理解できません。
答え1
パイピングの効果は、tee
最初のコマンドが何でも記録することです。標準出力ファイル(名前がコマンドライン引数として渡されますtee
)とtee
コマンドの標準出力に書き込みます。パイプが継続されず、コマンドへのリダイレクトを実行しない場合のtee
標準tee
出力は、シェル(通常は端末)の標準出力です。
これがrunningwho
とrunningがwho | tee test
端末に同じテキストを表示する理由です。あなたとの違いは、tee
ファイルに書き込むことです。
パイプが継続すると、who | tee test | wc -l
端末に書き込まれたすべての標準出力がパイプの次のコマンドに送信されます。これとは異なり、入力を標準出力(または他の場所)にコピーしないwc
コマンドです。代わりに統計を表示します。このオプションを使用すると、行数だけが表示されるため、表示されるすべてです。tee
wc
-l
2
だからそれだけ見る理由who | tee test | wc -l
とそれだけ見る理由は同じだ。このコマンドは出力をファイルに書き込みますが、次の場合を除き、端末に印刷しません。2
who | wc -l
tee
who
それ標準出力は端子です。これは通常デフォルトで適用されますが、他のコマンドにパイプする場合は適用されません。
|
パイプの次のコマンドへの入力として使用されるのではなく、出力がターミナルに表示されるコマンドが左側に表示された場合は、おそらく次のように書いています。標準エラー標準出力の代わりに。
答え2
tee
入力をコピーしてファイルに保存し、標準出力。そこから標準出力wc
...に移される標準入力のためのwc
。wc
カウントのみが返され、カウントの入力データはエコーされません。
理解したい場合は、cmd1 | tee file | cmd2
次のような効果があると考えればいいです。
cmd1 > file
cat file | cmd2
これではありません。実際にしかし、コマンドを実行する人の観点からは同じように見えます(cmd1
すべてがほぼ同時に発生するという印象を与えるほど速い場合)。実際にデータを受信しながらデータを入力しますfile
。cmd2
答え3
二つを同時に見たいwho
そして wc
doの出力bash
:
who | tee >(wc -l) test
出力:
me tty7 2017-10-16 18:17 (:0)
1
コンテンツを含めるテスト。