
Regularmente, he visto la siguiente sintaxis:
awk 'stuff' <file
sort <file
El caso es que suelo escribir:
awk 'stuff' file
sort file
Y las cosas funcionan perfectamente. Entonces, si ambas sintaxis son aproximadamente equivalentes (¿o lo son?), ¿hay algún beneficio al usar <file
la sintaxis?
EDITAR
Los hilos existentes cubren algunas de mis interrogaciones (usar <
implica que el shell abre el archivoprimeroyentonceslo pasa como entrada estándar al comando), pero siento que quedan algunos:
- ¿Cumplimiento con POSIX?
- ¿Es para disipar cualquier ambigüedad relativa a la naturaleza del
file
argumento? - ¿Es específico de un determinado tipo de caparazón?
- ¿Se considera obsoleto?
- En cuanto al rendimiento, ¿hay alguna diferencia notable?
- Cualquier ejemplo en el que se utilice uno contra el otro es bienvenido.
Respuesta1
Cualquiera de los dos funcionará si el comando admite la lectura desde la entrada estándar (el command <file
formulario) o desde un archivo con nombre en la lista de argumentos. Incluso tcsh
admite command <file
que la sintaxis sea bastante portátil; si un comando determinado puede leer un archivo en la lista de argumentos (o entrada estándar) depende del comando; ed(1)
por ejemplo, lee comandos de la entrada estándar, por lo que no puede leer un archivo desde la entrada estándar.
En el nivel C, un comando que lee desde una entrada estándar o un archivo con nombre hará 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 ...
}
Algunos comandos exigen que el command -
formulario indique una lectura de la entrada estándar, otros lo harán automáticamente (como en el código anterior) cuando la lista de argumentos esté vacía. De lo contrario, el código en cualquier caso tratará con fhandle
, y no le importa de dónde proviene la entrada (a menos que un mensaje de error deba incluir el nombre del archivo, pero eso puede incluirse en una variable adicional).