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
command-line
io-redirection
cat
Zain Rafi
fuente
fuente
cat < food
lugar decat < foo
food < cat
,;)cat
. Ahora, me pregunto de dónde viene el segundo mensaje, considerando que comienza conbash:
...Respuestas:
Esto ejecuta el
cat
comando con argumentofoo
. El error impreso en pantalla depende completamente de lo que haya decidido el programador del comando.Esto alimenta el contenido del archivo
foo
alcat
comando mediante la redirección de Bdin stdin . Si el archivo no existe, es Bash el que se queja.fuente
En
$ cat foo
el shell (aquí bash) ejecuta elcat
comando y pasa el parámetrofoo
. 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 < foo
es 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).
fuente
cat < foo
,cat
no 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 elcat < in > out
vscat in > out
donde el primero evitaout
ser anulado siin
no existe (el shell cancela el comando justo después de la< in
redirección fallida y no realiza la siguiente> out
redirección, y mucho menos invocarcat
).