">" 出力リダイレクトを使用する Linux の "|"パイプ動作

">" 出力リダイレクトを使用する Linux の "|"パイプ動作

コマンドを実行しています。

ls > a.txt | sort > b.txt

このコマンドは次のことを行います。

  1. 実装するls

  2. 種類

  3. ソートされた出力を生成してa.txt保存します。a.txt

  4. 創造b.txtだが、

誰でもこれを説明できますか?

私は自分のシェルを実装しており、この動作を理解してシミュレーションする必要があります。

答え1

|左コマンドの出力を右コマンドの入力として供給します。オペレータは>コマンドの出力を取得し、ファイルに保存します。これは、あなたの例で到着すると、すべて|が出力されないことを意味しますa.txt。したがって、sort右側の操作は空の文字列に対して操作を実行し、それを次の場所に保存します。b.txt

teeおそらくあなたが望むのは、ファイルと標準出力の両方に書き込むことができるコマンドを使用することです。

ls | tee a.txt | sort > b.txt

あなたが何をしたいのか本当に気になりますが、lsあなたのために物事を整理することも整理することもできます。

答え2

ls > a.txt | sort > b.txt

を実行していますls。それではあなたはリダイレクトしています。標準出力のみ次に、PIPE STDOUTを介してsortコマンドのSTDINにパイプSTDOUTをパイプしようとしますlsa.txt

STDOUT がファイルにリダイレクトされるため、a.txtsort コマンドの STDIN に sort の内容がないため、b.txtファイルは空です。

b.txtファイルから予想されるコンテンツを作成する方法はいくつかあります。

ls | sort > b.txt

または

ls > a.txt ; cat a.txt | sort > b.txt

どちらも実際にPIPEの左側にあるSTDOUTからのデータをPIPEの右側にあるSTDINに渡す必要があります。

答え3

TimとEricが言ったのと同様に、次のように>STDOUTをファイルにリダイレクトするとき|sorttee同時に2つのことをする:

  • STDINをファイルに送信する
  • STDINをSTDOUTに直接割り当てる

その結果、STDIN(lsコマンド)がファイルに保存され、コマンドで使用するためにSTDOUTに出力が続行されますsort。使用中の修正されたコマンドは次のとおりです。

ls | tee a.txt | sort > b.txt

関連情報