![Usando "](https://rvso.com/image/97241/Usando%20%22.png)
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 <file
a 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
file
argumento? - É 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 <file
formulário) ou de um arquivo nomeado na lista de argumentos. Até tcsh
suporta command <file
que 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 fhandle
e 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).