cat da un error diferente al abrir un archivo no existente


22

Los dos comandos siguientes intentan abrir un archivo no existente foo, pero los mensajes de error son un poco diferentes. ¿Cuál podría ser la razón?

$ cat foo
cat: cannot open foo
$ cat < foo
-bash: foo: No such file or directory

12
Chicos, no voten por las publicaciones solo en base al formato, especialmente para publicaciones provenientes de recién llegados. Aquí, es una pregunta muy válida.
Stéphane Chazelas

21
Debería ser en cat < foodlugar decat < foo
Tulains Córdova

66
@ TulainsCórdova O, en algunas culturas food < cat,;)
DepressedDaniel


1
Solo viene el primer error cat. Ahora, me pregunto de dónde viene el segundo mensaje, considerando que comienza con bash:...
Dmitry Grigoryev

Respuestas:


30
cat foo

Esto ejecuta el catcomando con argumento foo. El error impreso en pantalla depende completamente de lo que haya decidido el programador del comando.

cat < foo 

Esto alimenta el contenido del archivo fooal catcomando mediante la redirección de Bdin stdin . Si el archivo no existe, es Bash el que se queja.


20

En $ cat fooel shell (aquí bash) ejecuta el catcomando y pasa el parámetro foo. El programa cat elige interpretar ese parámetro como un nombre de archivo e intenta abrir el archivo. El error que ve es del programa cat que (naturalmente) no puede abrir el archivo.

La versión $ cat < fooes una redirección manejada por el shell. <es un operador de shell que le indica al shell que abra un archivo y lo redirija a stdin. El archivo no existe, por lo que obtiene un "No existe ese archivo". Esta vez, el error proviene del shell (bash) y se ve un poco diferente.

Es por eso que ves 2 errores diferentes. La causa es la misma, pero es de 2 programas diferentes (cat y bash).


18
No. in cat < foo, catno se invoca si falla la redirección. Eso (y tener un mensaje de error constante) es una de las razones por las que a menudo es mejor usar la redirección siempre que sea posible. También considere el cat < in > outvs cat in > outdonde el primero evita outser anulado si inno existe (el shell cancela el comando justo después de la < inredirección fallida y no realiza la siguiente > outredirección, y mucho menos invocar cat).
Stéphane Chazelas

¡Guay! Pura lógica. Editaré mis tonterías.
Claus Andersen
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.