![開いたファイルと開いたSTDINの違い、各[重複]を使用する場合](https://linux33.com/image/84803/%E9%96%8B%E3%81%84%E3%81%9F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A8%E9%96%8B%E3%81%84%E3%81%9FSTDIN%E3%81%AE%E9%81%95%E3%81%84%E3%80%81%E5%90%84%5B%E9%87%8D%E8%A4%87%5D%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88.png)
ほとんどのコマンドに関する多くの回答で、STDINで使用されているなどのtext-processing
コマンドを表示し、単にファイルを開くことができます。sed
awk
grep
例えば
$ 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' <file
file
into(bashの機能の1つ)の内容をSTDIN
読んでください。STDIN
grep
どちらにも正確な利点があるかどうかはわかりませんが、後者よりも前者を使い続けます。
後者は重複するのと同じように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への基本ストリームアクセス(照会なし、マッピング可能性なし)とファイル名パラメータの検索可能性のみを想定しています。