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
)が開いて読み取られます。