Использование «

Использование «

Регулярно я видел следующий синтаксис:

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

Связанный контент