cat donne une erreur différente lors de l'ouverture d'un fichier inexistant

22

Les deux commandes suivantes tentent d'ouvrir un fichier inexistant foo, mais les messages d'erreur sont un peu différents. Quelle pourrait être la raison?

$ cat foo
cat: cannot open foo
$ cat < foo
-bash: foo: No such file or directory
Zain Rafi
la source
12
Les gars, veuillez ne pas voter contre les messages uniquement en fonction du formatage, en particulier pour les messages provenant de nouveaux arrivants. Ici, c'est une question très valable.
Stéphane Chazelas
21
Cela devrait être cat < foodau lieu decat < foo
Tulains Córdova
6
@ TulainsCórdova Ou, dans certaines cultures,; food < cat)
DepressedDaniel
1
Librement lié: quels sont les opérateurs de contrôle et de redirection du shell?
G-Man dit `` Réintègre Monica ''
1
Seule la première erreur vient cat. Maintenant, je me demande d'où vient le deuxième message, étant donné qu'il commence par bash:...
Dmitry Grigoryev

Réponses:

30
cat foo

Cela exécute la catcommande avec argument foo. L'erreur imprimée à l'écran dépend entièrement de ce qui a été décidé par le programmeur de la commande.

cat < foo 

Cela alimente le contenu du fichier fooà la catcommande en utilisant la redirection Bash stdin . Si le fichier n'existe pas, c'est Bash qui s'en plaint.

dr01
la source
20

Dans $ cat foole shell (ici bash) exécute la catcommande et passe le paramètre foo. Le programme cat choisit d'interpréter ce paramètre comme un nom de fichier - et essaie d'ouvrir le fichier. L'erreur que vous voyez provient du programme cat qui (naturellement) ne peut pas ouvrir le fichier.

La version $ cat < fooest une redirection gérée par le shell. <est un opérateur shell qui demande au shell d'ouvrir un fichier et de le rediriger vers stdin. Le fichier n'existe pas, vous obtenez donc "Aucun fichier de ce type". Cette fois, l'erreur vient du shell (bash) et semble un peu différente.

C'est pourquoi vous voyez 2 erreurs différentes. La cause est la même - mais elle provient de 2 programmes différents (cat et bash).

Claus Andersen
la source
18
Non, dans cat < foo, catn'est pas appelé si la redirection échoue. Cela (et avoir un message d'erreur cohérent) est l'une des raisons pour lesquelles il est souvent préférable d'utiliser la redirection dans la mesure du possible. Considérez également le cat < in > outvs cat in > outoù le premier empêche outd'être écrasé s'il inn'existe pas (le shell annule la commande juste après l'échec de la < inredirection et ne fait pas la > outredirection suivante , encore moins l'invoquer cat).
Stéphane Chazelas
Cool! Logique pure. Je vais éditer mes bêtises.
Claus Andersen