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 < foodlugar decat < foofood < cat,;)cat. Ahora, me pregunto de dónde viene el segundo mensaje, considerando que comienza conbash:...Respuestas:
Esto ejecuta el
catcomando con argumentofoo. El error impreso en pantalla depende completamente de lo que haya decidido el programador del comando.Esto alimenta el contenido del archivo
fooalcatcomando mediante la redirección de Bdin stdin . Si el archivo no existe, es Bash el que se queja.fuente
En
$ cat fooel shell (aquí bash) ejecuta elcatcomando 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 < 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).
fuente
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 elcat < in > outvscat in > outdonde el primero evitaoutser anulado siinno existe (el shell cancela el comando justo después de la< inredirección fallida y no realiza la siguiente> outredirección, y mucho menos invocarcat).