it-swarm.com.de

Unterschied zwischen "Katze" und "Katze <"

Ich habe ein Tutorial durchgearbeitet und gesehen, dass beide cat myfile.txt und cat < myfile.txt. Gibt es einen Unterschied zwischen diesen beiden Befehlssequenzen? Es scheint, dass beide den Inhalt einer Datei in die Shell drucken.

70
rookie

Im ersten Fall öffnet cat die Datei, und im zweiten Fall öffnet die Shell die Datei und übergibt sie als Standardeingabe von cat.

Technisch könnten sie unterschiedliche Auswirkungen haben. Zum Beispiel wäre es möglich, eine Shell-Implementierung zu haben, die mehr (oder weniger) privilegiert ist als das Programm cat. In diesem Szenario kann es vorkommen, dass einer die Datei nicht öffnen kann, während der andere dies kann.

Dies ist nicht das übliche Szenario, wird jedoch erwähnt, um darauf hinzuweisen, dass Shell und cat nicht dasselbe Programm sind.

107
Thomas Dickey

Es gibt keinen wesentlichen sichtbaren Unterschied in Ihrem Testfall. Am offensichtlichsten ist die Fehlermeldung, die Sie erhalten, wenn keine Datei mit dem Namen myfile.txt im aktuellen Verzeichnis oder wenn Sie es nicht lesen dürfen.

Im ersteren Fall wird sich cat beschweren, und im letzteren Fall wird Ihre Shell deutlich zeigen, welcher Prozess versucht, die Datei zu öffnen, cat im ersteren und die Shell im letzteren einer.

$ cat myfile.txt
cat: myfile.txt: No such file or directory
$ cat < myfile.txt
ksh93: myfile.txt: cannot open [No such file or directory]

In einem allgemeineren Fall besteht ein Hauptunterschied darin, dass die Verwendung von Umleitungen nicht zum Drucken des Inhalts von mehr als einer Datei verwendet werden kann. Dies ist schließlich der ursprüngliche Zweck von cat (dh cat Befehl enate). Beachten Sie, dass die Shell ohnehin versucht, alle als umgeleitete Eingabe übergebenen Dateien zu öffnen, aber nur die letzte an cat übergibt, es sei denn, Sie verwenden zsh und dessen multios "zshism" .

$ echo one > one
$ echo two > two
$ cat one two # cat opens one, shows one, opens two, shows two
one
two
$ cat < one < two # sh opens one then opens two, cat shows stdin (two)
two
$ rm one two
$ echo one > one
$ cat one two # cat opens and shows one, fails to open two
one
cat: two: No such file or directory
$ cat < one < two # the Shell opens one then opens two, fails and 
                  # displays an error message, cat gets nothing on stdin
                  # so shows nothing
ksh93: two: cannot open [No such file or directory]

Auf einem Standardsystem haben die Shell und cat keinen Unterschied in den Dateizugriffsrechten, sodass beide erfolgreich fehlschlagen. Die Verwendung von Sudo zum Erhöhen der Berechtigungen von cat wird einen großen Unterschied im Verhalten bewirken, wie die Antwort von Thomas Dickey und die angehängten Kommentare bereits vorgeschlagen haben.

21
jlliagre

cat myfile.txt Liest die Datei myfile.txt Und druckt sie dann in die Standardausgabe.

cat < myfile.txt Hier cat werden keine Dateien zum Öffnen angegeben, so dass - wie bei vielen Unix-Befehlen - die Daten von der Standardeingabe gelesen werden, die von file.txt von der Shell und druckt auf Standardausgabe.

7
Hamza Abbad

@ Thomas Dickey 's Antwort ist brillant.

Ich möchte nur einige offensichtliche Fakten zum Fall des Lesens mehrerer Dateien hinzufügen (lose im Zusammenhang mit Ihrer Frage, aber immer noch):

  • cat <file1 <file2 <file3 liest nur Datei3, zumindest in Bash. (Eigentlich hängt es von der Shell ab, aber die meisten Shells werden dup jede angegebene Datei auf stdin setzen, wodurch die letzte wirksam wird.)
  • cat file1 file2 file3 liest alle angegebenen Dateien nacheinander (tatsächlich cat ist eine verkürzte Form des Wortes verketten).
  • cat file1 file2 file3 <file4 <file5 <file6 liest nur Datei1, Datei2, Datei3 (da cat stdin ignoriert, wenn Dateinamenargumente übergeben werden).
    • cat file1 file2 - file3 <file4 <file5 <file6 liest Datei1, Datei2, Datei6, Datei3 (da der Bindestrich cat zwingt, stdin nicht zu ignorieren).

Und über Fehler. Bei Unfähigkeit zu öffnen einige der als Argumente angegebenen Dateien (ohne <), cat überspringt fehlgeschlagene Dateien (mit der Ausgabe der relevanten Nachricht an stderr), liest aber trotzdem andere Dateien. Bei Unfähigkeit, mindestens eine der als Umleitungen angegebenen Dateien zu öffnen (mit <), Shell startet cat nicht einmal (dies tritt auch bei Umleitungen auf, die von cat tatsächlich nicht verwendet werden). In beiden Fällen wird ein fehlerhafter Exit-Code zurückgegeben.

6
sasha

Wir können einen anderen Befehl verwenden, um den Unterschied zwischen:

wc –w food2.txt

Mögliche Ausgabe:

6 food2.txt

Der Befehl teilt den Dateinamen mit, da er ihn kennt (als Argument übergeben).

wc –w < food2.txt

Mögliche Ausgabe:

6

Die Standardeingabe wird in die Datei food2.txt Umgeleitet, ohne dass der Befehl den Namen der Datei kennt.

0
user307770