
Регулярно я видел следующий синтаксис:
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
, и не будет заботиться о том, откуда поступает ввод (если только сообщение об ошибке не должно включать имя файла, но это можно вставить в дополнительную переменную).