2010-03-31 7 views
13

Gibt es einen Fall von ... oder Kontext, in dem cat file | ... sich anders verhält als ... <file?Katzendatei | ... vs ... <Datei

+0

Wenn Sie fragen, warum Sie die eine oder andere Form an verschiedenen Orten sehen, scheint es eine Frage der persönlichen Vorliebe zu sein. Kernighan und Pike bemerkten dies im Jahr 1984: http://www.amazon.com/Unix-Programming-Environment-Prentice-Hall-Software/dp/013937681X – msw

+1

Gehört zu superuser.com –

Antwort

9

Beim Lesen von einer normalen Datei, cat ist verantwortlich für das Lesen der Daten, führt es, wie es Ihnen gefällt, und könnte es in der Art beschränken, wie es in die Pipeline schreibt. Offensichtlich ist der Inhalt selbst erhalten, aber alles andere könnte verdorben sein. Zum Beispiel: Blockgröße und Datenankunftszeit. Zusätzlich ist das Rohr selbst nicht immer neutral: Es dient als zusätzlicher Puffer zwischen dem Eingang und ....

Schnelle und einfache Möglichkeit, die Blockgröße Thema zu machen offensichtlich:

$ cat large-file | pv >/dev/null 
5,44GB 0:00:14 [ 393MB/s] [    <=>         ] 
$ pv <large-file >/dev/null 
5,44GB 0:00:03 [1,72GB/s] [=================================>] 100% 
+1

Interessant, obwohl gegeben, dass read() verwendet a endlicher Puffer, so oder so werden Sie einige Prozesse minimale Puffergröße treffen. strace zeigt, dass die Katze 32kB liest und 128kB auf meiner Plattform verwendet. – msw

+0

Oh, hey, mein Beispiel stimmt nicht mit der Frage überein, da ich

+0

@msw es wird * sehr * abhängig von der Umsetzung von 'cat', aber ich werde versuchen, es auf eine andere Art und Weise sichtbar zu machen. –

1

cat file | startet ein anderes Programm (cat), das im zweiten Fall nicht gestartet werden muss. Es macht es auch verwirrender, wenn Sie "Here-Dokumente" verwenden möchten. Aber es sollte sich genauso verhalten.

4

cat ermöglicht es Ihnen, mehrere Dateien nacheinander zu leiten. Ansonsten erzeugen < Umleitung und cat file | die gleichen Nebenwirkungen.

2

Rohre verursachen eine Sub-Shell für den Befehl auf der rechten Seite aufgerufen werden. Dies stört die Umgebungsvariablen.

cat foo | while read line 
do 
    ... 
done 
echo "$line" 

gegen

while read line 
do 
    ... 
done < foo 
echo "$line" 
+0

Beide gaben die gleichen Ergebnisse, wenn ich sie ausprobierte. –

+0

interessante Nebenwirkung. – pra

+0

@JB: Setzen Sie eine Variable innerhalb der Schleife, und echo sie nach der Schleife. Der geänderte Wert wird nur nach dem umgeleiteten Formular beibehalten und nicht nach dem verrohrten Formular. Eine weitere Demonstration ist es, innerhalb der Schleife "cd" und nach der Schleife "pwd". –

4

Neben dem, was von anderen Nutzern stammen, wenn der Eingang Umleitung aus einer Datei unter Verwendung der Standardeingabe ist die Datei, aber wenn die Ausgabe von cat an die Eingangsleitungen, die Standardeingabe ein Stream mit dem Inhalt der Datei. Bei der Standardeingabe kann die Datei innerhalb der Datei suchen, aber die Pipe lässt dies nicht zu. Sie können sehen, durch eine Zip-Datei zu finden, und die folgenden Befehle:

zipinfo /dev/stdin < thezipfile.zip 

und

cat thezipfile.zip | zipinfo /dev/stdin 

Der erste Befehl den Inhalt der Zip-Datei zeigen, während die zweiten einen Fehler zeigen, obwohl es ist ein irreführender Fehler, weil zipinfo das Ergebnis des Suchaufrufs und Fehler später nicht überprüft.

3

Eine nutzlose Verwendung der Katze ist immer zu vermeiden. Es ist wie fahren mit der Handbremse auf. Es verschwendet CPU-Zyklen umsonst, das OS wechselt ständig zwischen dem Cat-Prozess und dem nächsten in der Pipe. Wenn alle nutzlosen Katzen der Welt weg wären und aufhören würden erfunden, neu erfunden, von Vater zu Sohn weitergegeben zu werden, hätten wir keine globale Erwärmung, weil wir leicht mit 1,21 Gigawatt gesparte Energie leben könnten.

Danke. Ich fühle mich jetzt besser. Bitte schließen Sie sich mir in meinem Kreuzzug an, um nutzlosen Gebrauch der Katze auf stackoverflow auszustoßen. Diese Website ist, soweit ich das sehe, ein wichtiger Beitrag zur Verbreitung unnützer Katzen. Ich beschuldige die Neulinge nicht, aber ich möchte sie unterrichten. Arbeiter und Neulinge der Welt, lockere die Handbremsen und rette den Planeten !!! 1!

1

Ein weiterer Unterschied ist das Verhalten bei einer Blockierung open() der Eingabedatei.

Zum Beispiel Eingang unter der Annahme ist ein FIFO ohne Autoren, ein Aufruf werden keine Kinderprogramme erzeugen, bis die Input-Datei geöffnet wird, während die anderen beiden Prozesse spawnen:

prog ... < a_fifo  # 'prog' not launched until shell can open file 
cat a_fifo | prog ... # 'prog' and 'cat' are running (latter may block on open) 

in der Praxis selten Angelegenheiten außer in konstruierten Umständen. prog kann in regelmäßigen Abständen protokollieren oder einige Bereinigungsarbeiten ausführen, während auf die Eingabe gewartet wird. Dies kann beispielsweise der Fall sein, wenn keine Eingabe möglich ist. (Warum wäre prog nicht ausgefeilt genug, um seinen eigenen Eingang zu öffnen?)