Diferencia entre "gato" y "gato <"

Respuestas:

106

En el primer caso, catabre el archivo, y en el segundo caso, el shell abre el archivo y lo pasa como catentrada estándar.

Técnicamente, podrían tener diferentes efectos. Por ejemplo, sería posible tener una implementación de shell que tuviera más (o menos) privilegios que el catprograma. Para ese escenario, uno podría no abrir el archivo, mientras que el otro podría.

Ese no es el escenario habitual, pero mencionó señalar que el shell y catno son el mismo programa.

Thomas Dickey
fuente
83
Sí, y por ejemplo puedes hacerlo sudo cat myfile.txt. Pero sudo cat < myfile.txtno funcionará si no tiene privilegios para leer el archivo.
zuazo
2
Tenga en cuenta que ksh93tiene catincorporado (no está habilitado de forma predeterminada a menos que lo haya hecho /opt/ast/bintemprano en su $PATHaunque).
Stéphane Chazelas
2
Algunos programas se comportan de manera diferente dependiendo de si obtienen un argumento de nombre de archivo o stdin. Por ejemplo, wcimprimirá el nombre del archivo antes de los recuentos cuando se le dé un argumento.
Barmar
21

No hay una diferencia visible importante en su caso de prueba. El más obvio sería el mensaje de error que aparece si no hay un nombre myfile.txten el directorio actual o si no se le permite leerlo.

En el primer caso, catse quejará y en el último caso, su shell lo hará, mostrando claramente qué proceso está intentando abrir el archivo, caten el primero y el shell en el último.

$ cat myfile.txt
cat: myfile.txt: No such file or directory
$ cat < myfile.txt
ksh93: myfile.txt: cannot open [No such file or directory]

En un caso más general, una diferencia importante es que el uso de redireccionamientos no se puede usar para imprimir el contenido de más de un archivo, que es, después de todo, el propósito original del comando cat(es decir, cat enate). Tenga en cuenta que el shell de todos modos intentará abrir todos los archivos pasados ​​como entrada redirigida, pero solo pasará el último a catmenos que use zshy su multios"zshism".

$ echo one > one
$ echo two > two
$ cat one two # cat opens one, shows one, opens two, shows two
one
two
$ cat < one < two # sh opens one then opens two, cat shows stdin (two)
two
$ rm one two
$ echo one > one
$ cat one two # cat opens and shows one, fails to open two
one
cat: two: No such file or directory
$ cat < one < two # the shell opens one then opens two, fails and 
                  # displays an error message, cat gets nothing on stdin
                  # so shows nothing
ksh93: two: cannot open [No such file or directory]

En un sistema estándar, el shell y catno tienen diferencias en los derechos de acceso a archivos, por lo que ambos tendrán éxito o fallarán por igual. El uso sudopara aumentar catlos privilegios hará una gran diferencia en el comportamiento, como Thomas Dickey respondió y los comentarios adjuntos ya sugirieron.

jlliagre
fuente
55
Por curiosidad, ¿realmente utilizas kshtu propia voluntad, y si es así ... por qué ?
gato
1
@cat: esa pregunta obviamente se basa en la ignorancia. construirlo usted mismo y ver.
mikeserv 01 de
2
@mikeserv que estaba destinado a ser impertinente, no muy grosero, pero lo suficientemente justo, supongo
gato
2
@cat: no suponía lo contrario. la ignorancia no es algo de lo que avergonzarse, es solo una falta de conocimiento. Si no entiende por qué alguien podría elegir usar ksh93, entonces solo puedo suponer que es porque nunca lo ha usado. así que te recomiendo que lo hagas. Vale la pena intentarlo, para estar seguro. y créeme cuando te digo que, en comparación con bash, ksh93es de lejos el mejor caparazón. Es la concha, casi.
mikeserv 01 de
55
Como @mikeserv señaló en otro lugar , cat < file1 > file2tiene un efecto muy diferente cat file1 > file2al del caso en que file1es ilegible o inexistente. (La última forma se trunca file2; la primera no.)
Comodín
7

cat myfile.txtlee el archivo y myfile.txtluego lo imprime en la salida estándar.

cat < myfile.txtaquí catno se le da ningún archivo para abrir, así que, como muchos comandos de Unix, lee los datos de la entrada estándar, que es dirigida desde file.txtel shell, e imprime en la salida estándar.

Hamza Abbad
fuente
6

La respuesta de @Thomas Dickey es brillante.

Solo quiero agregar algunos hechos obvios sobre el caso de leer varios archivos (relacionados con su pregunta, pero aún así):

  • cat <file1 <file2 <file3leerá solo el archivo3, al menos en bash. (En realidad, depende del shell, pero la mayoría de los shells duplicarán cada archivo especificado en stdin, lo que hace que el último tenga efecto).
  • cat file1 file2 file3leerá todos los archivos especificados secuencialmente (en realidad, cat es la forma abreviada de la palabra concatenar ).
  • cat file1 file2 file3 <file4 <file5 <file6 leerá solo archivo1, archivo2, archivo3 (ya que cat ignora la entrada estándar cuando se pasan los argumentos del nombre de archivo).
    • cat file1 file2 - file3 <file4 <file5 <file6 leerá file1, file2, file6, file3 (ya que el guión obliga a cat a no ignorar stdin).

Y sobre los errores. En caso de no poder abrir algunos de los archivos especificados como argumentos (sin <), cat omitirá los archivos fallidos (con la salida del mensaje relevante a stderr), pero aún leerá otros archivos. En caso de que no se pueda abrir al menos uno de los archivos especificados como redireccionamientos (con <), el shell ni siquiera iniciará cat (esto ocurre incluso para redireccionamientos realmente no utilizados por cat). En ambos casos, se devolverá un código de salida erróneo.

Sasha
fuente
1
Cabe destacar que en el primer ejemplo catserá, sin embargo, abrir file1y file2, con la misma file4y file5en su tercer ejemplo. Solo se mostrará file3, resp. file6contenido si estas instrucciones abiertas anteriores tienen éxito.
jlliagre
@jlliagre, gracias, no lo sabía. Strace obviamente demostró su corrección. Corregí el texto entre paréntesis para los casos 1 y 3a.
Sasha
0

podemos usar otro comando para notar la diferencia entre:

wc –w food2.txt .

Salida posible:

6 food2.txt .

el comando le dice el nombre del archivo ya que lo sabe (pasado como argumento).

wc –w < food2.txt .

Salida posible:

6 .

la entrada estándar se redirige al archivo food2.txt sin que el comando lo sepa.

usuario307770
fuente