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
command-line
io-redirection
cat
Zain Rafi
quelle
quelle
cat < food
stattcat < foo
food < cat
;)cat
. Nun frage ich mich, woher die zweite Nachricht kommt, wenn man bedenkt, dass sie mitbash:
...Antworten:
Dies führt den
cat
Befehl mit Argument ausfoo
. Der auf dem Bildschirm ausgedruckte Fehler hängt ganz davon ab, was der Programmierer des Befehls entschieden hat.Dadurch wird der Inhalt der Datei mithilfe der Bash-Stdin-Umleitung
foo
an dencat
Befehl übergeben . Wenn die Datei nicht existiert, ist es Bash, der sich darüber beschwert.quelle
In
$ cat foo
der Shell (hier bash) wird dercat
Befehl ausgeführt und der Parameter übergebenfoo
. 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 < foo
ist 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).
quelle
cat < foo
,cat
wird 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 dascat < in > out
VS,cat in > out
bei dem das erstere verhindertout
, dass es überschrieben wird, wennin
es nicht vorhanden ist (die Shell bricht den Befehl unmittelbar nach der fehlgeschlagenen< in
Umleitung ab und führt die nächste> out
Umleitung nicht aus, geschweige denn den Aufrufcat
).