リダイレクトとパイプ出力

リダイレクトとパイプ出力

rpm -qa > file | wc -l0を返します。私は何が間違っていましたか?私の目標は明らかだと思いますが、うまくいきません。これはxargsまたはのための専門ですかtee

答え1

はい、仕事ですtee

rpm -qa | tee file | wc -l

シェルリダイレクト( >) はリダイレクトなので、出力ストリームを一度に別の場所にしかポイントできません。|その時点では何も見えないでしょう。teeこれは、ストリームを2つの部分に分割する目的で設計されています。ある部分はファイルに移動し、他の部分はまだ標準出力にあります。上記のコマンドは、目的の操作を正確に実行します。

xargsここでは役に立ちません。

答え2

はい、これはTシャツの仕事です。

rpm -qa | tee file | wc -l

この構造では、a | baの標準出力はbの標準入力に移動します。a > file | ba形式のすべての出力がファイルに移動し、bの標準入力に何も移動しない場合。teeこのコマンドは、標準入力として受け取ったすべてをファイルと標準出力にコピーします。

答え3

rpm -qa > file ; wc -l file

あなたが欲しいものをする必要があります。

答え4

Bourne または POSIX 互換シェルでは、リダイレクトは左から右に処理され、パイプが最初に表示されます。したがって、コマンドは次のように実行されます(サブプロセス2で発生するジョブは省略されます)。

  1. パイプラインを作成します。
  2. 2つのサブプロセス1と2をフォークします。
  3. 標準出力1をパイプにリダイレクトします。
  4. 標準出力1をにリダイレクトしますfile
  5. 1. 実行rpm -qa

サブプロセス1の出力を両方のチャネル(ファイルとパイプ)にコピーするには、誰かがデータの2つのコピーを作成する必要があります。これがまさにtee目的です。

rpm -qa | tee file | wc -l

Zshには、次の組み込み出力コピー機能があります。複数のオペレーティングシステム。 zsh で (このオプションを保持する zsh でのみmultios、 POSIX 互換シェルや POSIX 以前の Bourne シェル、 (t)csh ではない) 作成したようなコマンドはデータを双方向にコピーします。リダイレクト。

# in zsh
rpm -qa >file | wc -l

関連情報