cat gibt einen anderen Fehler beim Öffnen einer nicht existierenden Datei aus

22

Die beiden folgenden Befehle versuchen, eine nicht vorhandene Datei zu öffnen foo, die Fehlermeldungen unterscheiden sich jedoch geringfügig. Was könnte der Grund sein?

$ cat foo
cat: cannot open foo
$ cat < foo
-bash: foo: No such file or directory
Zain Rafi
quelle
12
Jungs, bitte stimmen Sie Beiträge nicht nur basierend auf der Formatierung ab, insbesondere nicht für Beiträge, die von Neulingen stammen. Hier ist es eine sehr berechtigte Frage.
Stéphane Chazelas
21
Es sollte cat < foodstattcat < foo
Tulains Córdova
6
@ TulainsCórdova Oder in einigen Kulturen food < cat;)
DepressedDaniel
1
Locker verwandt: Was sind die Steuerungs- und Umleitungsoperatoren der Shell?
G-Man sagt, dass Monica
1
Nur der erste Fehler kommt von cat. Nun frage ich mich, woher die zweite Nachricht kommt, wenn man bedenkt, dass sie mit bash:...
Dmitry Grigoryev

Antworten:

30
cat foo

Dies führt den catBefehl mit Argument aus foo. Der auf dem Bildschirm ausgedruckte Fehler hängt ganz davon ab, was der Programmierer des Befehls entschieden hat.

cat < foo 

Dadurch wird der Inhalt der Datei mithilfe der Bash-Stdin-Umleitungfoo an den catBefehl übergeben . Wenn die Datei nicht existiert, ist es Bash, der sich darüber beschwert.

dr01
quelle
20

In $ cat fooder Shell (hier bash) wird der catBefehl ausgeführt und der Parameter übergeben foo. Das cat-Programm interpretiert diesen Parameter als Dateinamen und versucht, die Datei zu öffnen. Der Fehler, den Sie sehen, stammt aus dem cat-Programm, das die Datei (natürlich) nicht öffnen kann.

Die Version $ cat < fooist eine Umleitung, die von der Shell verwaltet wird. <ist ein Shell-Operator, der die Shell anweist, eine Datei zu öffnen und sie nach stdin umzuleiten. Die Datei existiert nicht, daher erhalten Sie die Meldung "No such file". Diesmal kommt der Fehler von der Shell (bash) und sieht ein bisschen anders aus.

Aus diesem Grund werden 2 verschiedene Fehler angezeigt. Die Ursache ist die gleiche - aber sie stammt aus 2 verschiedenen Programmen (cat und bash).

Claus Andersen
quelle
18
Nein in cat < foo, catwird nicht aufgerufen, wenn die Umleitung fehlschlägt. Dies (und eine konsistente Fehlermeldung) ist einer der Gründe, warum es oft besser ist, nach Möglichkeit die Umleitung zu verwenden. Berücksichtigen Sie auch das cat < in > outVS, cat in > outbei dem das erstere verhindert out, dass es überschrieben wird, wenn ines nicht vorhanden ist (die Shell bricht den Befehl unmittelbar nach der fehlgeschlagenen < inUmleitung ab und führt die nächste > outUmleitung nicht aus, geschweige denn den Aufruf cat).
Stéphane Chazelas
Cool! Logik pur. Ich werde meinen Unsinn bearbeiten.
Claus Andersen