Usando "

Usando "

Regularmente, tenho visto a seguinte sintaxe:

awk 'stuff' <file
sort <file

Acontece que normalmente escrevo:

awk 'stuff' file
sort file

E as coisas funcionam perfeitamente. Portanto, se ambas as sintaxes são aproximadamente equivalentes (ou são?), há algum benefício em usar <filea sintaxe?

EDITAR

Os tópicos existentes cobrem algumas das minhas interrogações (usar <implica que o shell abra o arquivoprimeiroeentãopassa como entrada padrão para o comando), mas sinto que alguns permanecem:

  • Conformidade com POSIX?
  • Será para dissipar qualquer ambiguidade relativa à natureza do fileargumento?
  • É específico para um determinado tipo de shell?
  • É considerado obsoleto?
  • Em termos de desempenho, há uma diferença notável?
  • Qualquer exemplo em que você usaria um contra o outro é bem-vindo.

Responder1

Qualquer um deles funcionará se o comando suportar a leitura da entrada padrão (o command <fileformulário) ou de um arquivo nomeado na lista de argumentos. Até tcshsuporta command <fileque a sintaxe seja bastante portátil; se um determinado comando pode ler um arquivo na lista de argumentos (ou entrada padrão) depende do comando; ed(1)por exemplo, lê comandos da entrada padrão, portanto não pode ler um arquivo da entrada padrão.

No nível C, um comando que lê uma entrada padrão ou um arquivo nomeado fará algo como

#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 ...
}

Alguns comandos exigem que o command -formulário indique uma leitura da entrada padrão, outros farão isso automaticamente (como no código acima) quando a lista de argumentos estiver vazia. Caso contrário, o código em ambos os casos estará lidando com fhandlee não se importará de onde vem a entrada (a menos que uma mensagem de erro precise incluir o nome do arquivo, mas isso pode ser preso em uma variável adicional).

informação relacionada