Unterschied zwischen "Katze" und "Katze <"

Antworten:

106

Im ersten Fall wird catdie Datei geöffnet, und im zweiten Fall wird die Datei von der Shell geöffnet und als catStandardeingabe übergeben.

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 catProgramm. In diesem Szenario kann es sein, dass einer die Datei nicht öffnet, während der andere dies könnte.

Das ist nicht das übliche Szenario, aber erwähnt, dass die Shell und catnicht das gleiche Programm sind.

Thomas Dickey
quelle
83
Ja, und das können Sie zum Beispiel tun sudo cat myfile.txt. Funktioniert sudo cat < myfile.txtjedoch nicht, wenn Sie keine Berechtigungen zum Lesen der Datei haben.
zuazo
2
Beachten Sie, dass dies bereits integriert ksh93ist cat(standardmäßig nicht aktiviert, es sei denn, Sie haben bereits /opt/ast/binfrüh daran gearbeitet $PATH).
Stéphane Chazelas
2
Einige Programme verhalten sich unterschiedlich, je nachdem, ob sie ein Dateinamenargument oder stdin erhalten. Gibt beispielsweise wcden Dateinamen vor der Anzahl aus, wenn ein Argument angegeben wird.
Barmar
21

Es gibt keinen wesentlichen sichtbaren Unterschied in Ihrem Testfall. Die offensichtlichste ist die Fehlermeldung, die Sie erhalten, wenn myfile.txtim aktuellen Verzeichnis keine Datei mit dem Namen vorhanden ist oder wenn Sie sie nicht lesen dürfen.

Im ersteren Fall catwird sich die Shell beschweren und im letzteren Fall wird deutlich, welcher Prozess versucht, die Datei zu öffnen, catim ersteren und in der Shell im letzteren.

$ 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 wesentlicher Unterschied darin, dass Umleitungen nicht zum Drucken des Inhalts mehrerer Dateien verwendet werden können, was schließlich dem ursprünglichen Zweck des Befehls cat(dh cat enate) entspricht. Beachten Sie, dass die Schale trotzdem versuchen , alle Dateien zu öffnen , wie umgeleitet Eingabe übergeben, aber nur passieren tatsächlich die letzte zu , cates sei denn Sie verwenden zshund seine 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 catdie Dateizugriffsrechte keinen Unterschied, sodass beide gleichermaßen fehlschlagen. Die Verwendung sudoder catRechte von raise wird einen großen Unterschied im Verhalten bewirken, wie Thomas Dickey und die beigefügten Kommentare bereits angedeutet haben.

jlliagre
quelle
5
Verwenden Sie aus Neugierde wirklich kshIhren eigenen Willen, und wenn ja, warum ?
Katze
1
@cat - diese Frage basiert offensichtlich auf Unwissenheit. Bauen Sie es selbst und sehen Sie.
mikeserv
2
@ MikeServ, der flippig sein sollte, nicht ernsthaft unhöflich, aber fair genug, nehme ich an
Katze
2
@cat - ich habe nicht anders angenommen. Unwissenheit ist kein Grund, sich zu schämen - es ist nur ein Mangel an Wissen. Wenn Sie nicht verstehen, warum sich jemand für die Verwendung von ksh93 entschieden hat, kann ich nur davon ausgehen, dass dies der Fall ist, weil Sie es nie verwendet haben. also empfehle ich dir. Es ist sicher einen Versuch wert. und glauben Sie mir, wenn ich Ihnen sage, dass im Vergleich zu bash, ksh93ist bei weitem die bessere Schale. es ist fast die Muschel.
mikeserv
5
Wie @mikeserv an anderer Stelle hervorhob , cat < file1 > file2wirkt sich dies ganz anders aus, cat file1 > file2als wenn file1es nicht lesbar oder nicht vorhanden ist. (Das letztere Formular wird abgeschnitten file2, das erstere nicht.)
Wildcard
7

cat myfile.txtLiest die Datei myfile.txtund druckt sie dann auf die Standardausgabe.

cat < myfile.txtcatDa hier keine zu öffnenden Dateien angegeben sind, werden - wie bei vielen Unix-Befehlen - die Daten von der Standardeingabe gelesen, die file.txtvon der Shell an diese geleitet wird, und auf die Standardausgabe gedruckt.

Hamza Abbad
quelle
6

@Thomas Dickeys Antwort ist brillant.

Ich möchte nur einige offensichtliche Fakten über den Fall des Lesens mehrerer Dateien hinzufügen (die mit Ihrer Frage in Zusammenhang stehen, aber immer noch):

  • cat <file1 <file2 <file3liest nur file3, zumindest in bash. (Tatsächlich hängt es von Shell, aber die meisten Schalen werden dup jede angegebene Datei stdin, die die letzte zu Effekt verursacht.)
  • cat file1 file2 file3liest alle angegebenen Dateien nacheinander (tatsächlich ist cat 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 file1, file2, file6, file3 (als Bindestrich zwingt cat, stdin nicht zu ignorieren).

Und über Fehler. Wenn einige der als Argumente angegebenen Dateien nicht geöffnet werden können (ohne <), überspringt cat fehlgeschlagene Dateien (mit der Ausgabe der entsprechenden Nachricht an stderr), liest jedoch noch andere Dateien. Wenn mindestens eine der als Umleitungen (mit <) angegebenen Dateien nicht geöffnet werden kann , startet die Shell cat nicht (dies gilt auch für Umleitungen, die von cat nicht verwendet werden). In beiden Fällen wird ein fehlerhafter Beendigungscode zurückgegeben.

Sasha
quelle
1
Beachten Sie, dass in Ihrem ersten Beispiel cattrotzdem file1und geöffnet wird file2, genau file4wie file5in und in Ihrem dritten Beispiel. Es wird nur angezeigt file3, resp. file6Inhalt, wenn diese vorherigen offenen Anweisungen erfolgreich sind.
Juli
@jlliagre, danke, das wusste ich nicht. Strace hat offensichtlich Ihre Richtigkeit bewiesen. Ich habe den in Klammern gesetzten Text für die Fälle 1 und 3a korrigiert.
Sasha
0

Mit einem anderen Befehl können wir den Unterschied feststellen zwischen:

wc –w food2.txt .

Mögliche Ausgabe:

6 food2.txt .

Der Befehl gibt den Dateinamen an, 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 davon Kenntnis hat.

user307770
quelle