プログラムはパイプから何を読むかをどのように知ることができますか? [コピー]

プログラムはパイプから何を読むかをどのように知ることができますか? [コピー]

Unixコマンドラインプログラムはどのファイルを読み取るかをどのように知ることができますか?

たとえば、

 cat someFile | foo

プログラムはどのfooファイルを読み取るのか、どのようにディスク上でそのファイルを開いて読み取るのかを担当するプロセスは何ですか?

ベストアンサー1

fooどのファイルを読み取るべきかわからず、(おそらく)標準入力ストリームから読み取るだけです。このデータストリームはシェルを介してコマンドの標準出力ストリームに接続されますcat。この「管理パイプ」は、2つのプロセス(同時に実行)を開始するときにシェルによって実行されます。

質問の例では、cat読み取り用にファイルを開き、ファイルを読み取り、データを標準出力に渡します。

「結果をどこに書くのか、どうすればわかりますか?」と質問することもできます。cat答えは、シェルを介してコマンドの標準入力ストリームに接続されている標準出力ストリームに書き込むことですfoo。同様にfoo、コマンドへの追加のパイプやリダイレクトがないため、コマンドの標準出力ストリームはシェルを介して端末に接続されます。


あなたが示すパイプラインは、

cat someFile | foo

機能的には次のとおりです。

foo <somefile

cat実際には必要ないのでここから削除しました。シェルは標準入力ストリームを与えられfooたファイルにリンクするので、効果は同じです(標準入力ストリームから読み取ることfooができます)。somefile

最後のコマンドは、fooまだ名前付きファイルからデータを読み取るかどうかはわかりませんsomefile。また、これ以上の出力を読み取らないという事実もわかりませんcat。前と同様に、標準入力ストリームを読み込みます。

シェルはsomefile読み取り用にファイルを開きますが、ファイルから何も読み取らずに標準入力ストリームを読み取るfooために開いたファイルに接続します。


fooこのコマンドが何をしているのか、実際に機能しているのかわからないことに注意してください。何もない標準入力ストリームを使用する場合、またはコマンドラインからファイル名を読み取る必要がある場合は使用してください。この情報はプログラムマニュアルにありますfoo

foo実際の状況では必要コマンドラインにパス名を指定して特定のファイルを読み取るように指示するには、次のようにします。

foo somefile

これでfooファイルを開いて読むことを担当します。

ファイルを何らかの方法で処理する必要がある場合(" cat"は、から読み取ったデータを実際に変更するより複雑なプロセスであると仮定してくださいsomefile):

cat somefile >newfile
foo newfile
rm newfile

つまり、ファイルを処理し、結果を新しい一時ファイルに保存してから、一時ファイル名をに渡しますfoo。その後、一時ファイルを削除します。

または、プロセスの置き換えを理解するシェルを使用してください(例bash:)。

foo <( cat somefile )

ここで、シェルは出力がcat somefile一時ファイル(または名前付きパイプ、重要ではない)に書き込まれるように準備し、プロセス置換の代わりにそのデータのパス名が挿入されます<( ... )fooそれからファイルで開いて読んでください。

最後の例では、catソースファイルが開かれて読み取られ、fooシェルが提供するすべてのパス名(見つかった出力cat)が開いて読み取られます。

おすすめ記事