![すでにファイルを処理するコマンドでファイルの入力リダイレクトに「](https://rvso.com/image/97241/%E3%81%99%E3%81%A7%E3%81%AB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%87%A6%E7%90%86%E3%81%99%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%85%A5%E5%8A%9B%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88%E3%81%AB%E3%80%8C.png)
定期的に、次の構文を目にします。
awk 'stuff' <file
sort <file
実は、私はいつもこう書いています:
awk 'stuff' file
sort file
そして、すべては完璧に動作します。では、両方の構文がほぼ同等である場合 (または同等である場合)、<file
構文を使用することで何か利点があるのでしょうか?
編集
既存のスレッドは私の質問のいくつかをカバーしています(使用は<
シェルがファイルを開くことを意味します初めそしてそれからコマンドに標準入力として渡します) が、いくつか残っているように感じます:
- POSIX準拠?
file
それは議論の性質に関する曖昧さを払拭するためでしょうか?- それは特定のタイプのシェルに特有のものですか?
- 非推奨とみなされますか?
- パフォーマンスの面では、顕著な違いはありますか?
- どちらか一方を他方に対して使用する例であれば、歓迎します。
答え1
どちらも、コマンドが標準入力 (フォームcommand <file
) または引数リスト内の名前付きファイルからの読み取りをサポートしている場合は機能します。 もtcsh
サポートしているcommand <file
ため、構文はかなり移植可能です。特定のコマンドが引数リスト (または標準入力) 内のファイルを読み取ることができるかどうかは、コマンドによって異なります。ed(1)
たとえば、 は標準入力からコマンドを読み取りますが、標準入力からファイルを読み取ることはできません。
Cレベルでは、標準入力または名前付きファイルから読み込むコマンドは次のような動作をする。
#include <err.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
FILE *fhandle;
// option processing here ...
if (argc == 0 || strncmp(*argv, "-", (size_t) 2) == 0) {
fhandle = stdin;
} else {
if ((fhandle = fopen(*argv, "r")) == NULL)
err(1, "could not open '%s'", *argv);
}
// read from fhandle here, which is either from stdin or a file ...
}
command -
コマンドによっては、標準入力からの読み取りを示すフォームを要求するものもあれば、引数リストが空の場合に自動的にそれを示すもの(上記のコードのように)もあります。それ以外の場合、どちらの場合もコードは を処理しfhandle
、入力元は考慮しません(エラー メッセージにファイル名を含める必要がある場合を除きますが、ファイル名は追加の変数に挿入できます)。