パイプと入力ストリームは同じコマンドにリダイレクトされます。コマンドはどの入力を使用しますか?

パイプと入力ストリームは同じコマンドにリダイレクトされます。コマンドはどの入力を使用しますか?

以下のコマンドを実行しようとしています。

cat numbers.txt | sort < words.txt

上記のコマンドには、 sort コマンドの入力ストリームを供給する cat コマンドのパイプがあります。しかし同時に、sort コマンドの入力ストリームも word.txt ファイルにリダイレクトされます。コマンドを実行すると、word.txtのデータがsortコマンドによってソートされ、端末に再表示されることがわかりました。

この場合、シェルがパイプとリダイレクトをどのように処理するのかわかりません。コマンドが2つの異なるソースからの入力ストリームを受け入れることができるかどうか。内部的にどのように動作するかについての私の考えは、リダイレクトとパイプがコマンドに沿って左から右に処理されるため、catコマンドの出力ストリームが最初にsortコマンドの入力ストリームとして使用されることです。ただし、sortコマンドはこのパイプの後に別の入力ストリームリダイレクトを提供するため、sortコマンドの入力ストリームはword.txtに接続されます。したがって、Words.txt のデータは、コマンドが実行されたときにのみ sort コマンドに到達します。

また、次のコマンドが実行されない理由もあります。追加のリダイレクトによるオーバーライドでリダイレクトを変更しました。

cat numbers.txt | sort << words.txt

一つある質問部分はこれに似ていますが、シェルがパイプとリダイレクトをどのように処理するかはよく理解できません。

ベストアンサー1

リダイレクトは左から右に処理されます。Bashでパイプに続く(実際にはすべてのPOSIXシェル)。存在する

cat numbers.txt | sort < words.txt

シェルは最初にsort(将来の)標準入力をそれが出てくるパイプに設定し、次に処理時に読み取るようにcat変更< words.txtしますwords.txt

<<区切り文字を開始します。

cat numbers.txt | sort << words.txt

「words.txt」(コマンドで指定された入力終了タグなので)が表示されるのを待ちます。よりシェルの制御およびリダイレクト演算子は何ですか?

おすすめ記事