開いたファイルと開いたSTDINの違い、各[重複]を使用する場合

開いたファイルと開いたSTDINの違い、各[重複]を使用する場合

ほとんどのコマンドに関する多くの回答で、STDINで使用されているなどのtext-processingコマンドを表示し、単にファイルを開くことができます。sedawkgrep

例えば

$ sed -e 's|foo|bar|g' file # open file
$ sed -e 's|foo|bar|g' <file # open STDIN

または

$ grep 'PATTERN' file # open file
$ grep 'PATTERN' <file # open STDIN

個人的にファイルを開く方法を常に使用していますが、いつ使用して使用しないか、そして違いが何であるかを知りたいです。

答え1

それはニーズに依存します。この場合、標準入力のファイル名またはパイプを使用すると違いがあります。

bash-4.1$ cat /etc/passwd /etc/group | wc -l
128
bash-4.1$ wc -l /etc/passwd /etc/group
  49 /etc/passwd
  79 /etc/group
 128 total
bash-4.1$ 

さらに、標準入力はあまりlseek(3)強力ではない傾向があるため、アプリケーションに照会できるファイル記述子が必要な場合(最初に巻き戻すなど)、標準入力を使用できない可能性があります。

答え2

出力に関して違いはありません。

$ grep 'PATTERN' fileパラメーター2で指定されたファイルが開き、パターンが検索されます。

$ grep 'PATTERN' <filefileinto(bashの機能の1つ)の内容をSTDIN読んでください。STDINgrep

どちらにも正確な利点があるかどうかはわかりませんが、後者よりも前者を使い続けます。

後者は重複するのと同じようにcat file | grep 'PATTERN'重複cat file | sed -e 's|foo|bar|g'します。

答え3

場合によっては、2つはまったく同じではありません。たとえば、次のようになります。

$ wc -l ./script.sh
4948 ./script.sh
$ wc -l <./so
4948

まずwc、どのファイルが処理されているかを特定し、ファイル名と行番号を印刷します。 2番目のコマンドでは、wcどのファイルが処理されているかわからず、匿名で入力されます。

grepを使用する例の特定のコマンドでは:

$ grep 'PATTERN' file
$ grep 'PATTERN' <file

出力に違いはありません。しかし、これには次のものがあります(一致する場合)。

$ grep -H 'PATTERN' file
$ grep -H 'PATTERN' <file

また、リダイレクトの場合、シェルは<fileファイルを読み込んでおり、バッファの速度やサイズ(他のコマンドの場合)にも影響を与える可能性があります。

答え4

違いは、主に誰がファイルを開くかです。これは重要かもしれません。セキュリティ上の理由- シェルは、自分が起動したプログラムにない権限を持つことができます。

STDINメソッドを使用することは、開始されたプログラムによって生成されたプロセスツリー全体にストリームが継承されることを意味します。これはいくつかの状況で役に立ちます。

とともにファイルを開くこの方法では、起動したプログラムがファイル名をより簡単に知ることができます。ファイル名ルーティングを使用するプログラムは出力でファイル名を使用でき、ファイル名ルーティングはパフォーマンスなどの他の点で異なる場合があります。プログラムは通常、STDINへの基本ストリームアクセス(照会なし、マッピング可能性なし)とファイル名パラメータの検索可能性のみを想定しています。

関連情報