cat dà errori diversi quando si apre un file inesistente


22

Entrambi i seguenti comandi tentano di aprire un file inesistente foo, ma i messaggi di errore sono leggermente diversi. Quale potrebbe essere la ragione?

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

12
Ragazzi, vi preghiamo di non sottovalutare i post solo in base alla formattazione, specialmente per i post provenienti da nuovi arrivati. Qui, è una domanda molto valida.
Stéphane Chazelas,

21
Dovrebbe essere cat < foodinvece dicat < foo
Tulains Córdova,

6
@ TulainsCórdova O, in alcune culture food < cat,;)
DepressedDaniel


1
Viene solo il primo errore cat. Ora, mi chiedo da dove provenga il secondo messaggio, considerando che inizia con bash:...
Dmitry Grigoryev

Risposte:


30
cat foo

Questo esegue il catcomando con argomento foo. L'errore stampato sullo schermo dipende interamente da ciò che è stato deciso dal programmatore del comando.

cat < foo 

In questo modo il contenuto del file viene inviato fooal catcomando utilizzando il reindirizzamento Bash stdin . Se il file non esiste, è Bash a lamentarsene.


20

Nella $ cat fooshell (qui bash) esegue il catcomando e passa il parametro foo. Il programma cat sceglie di interpretare quel parametro come un nome di file e tenta di aprire il file. L'errore che vedi proviene dal programma cat che (naturalmente) non può aprire il file.

La versione $ cat < fooè un reindirizzamento gestito dalla shell. <è un operatore di shell che indica alla shell di aprire un file e reindirizzarlo su stdin. Il file non esiste quindi si ottiene un "Nessun file simile". Questa volta l'errore proviene dalla shell (bash) e sembra un po 'diverso.

Ecco perché vengono visualizzati 2 errori diversi. La causa è la stessa, ma proviene da 2 programmi diversi (cat e bash).


18
No. in cat < foo, catnon viene invocato se il reindirizzamento fallisce. Questo (e con un messaggio di errore coerente) è uno dei motivi per cui spesso è meglio usare il reindirizzamento ove possibile. Considera anche il cat < in > outvs cat in > outdove il primo impedisce outdi essere sovrascritto se innon esiste (la shell annulla il comando subito dopo il < inreindirizzamento fallito e non fa il > outreindirizzamento successivo , per non parlare del richiamo cat).
Stéphane Chazelas,

Freddo! Logica pura. Modificherò le mie sciocchezze.
Claus Andersen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.