Da ich es hier immer wieder sehe.
Useless use of cat
"The purpose of cat(1) is to concatenate (or "catenate") files. If it's only one file, concatenating it with nothing at all is a waste of time, and costs you a process."
Das heißt, folgendes ist verschwenderisch:
$ cat file | wc -l
Obiges schreibt man besser so:
$ wc -l < file $ wc -l file
wc(1) akzeptiert entweder eine Datei als Argument oder liest von STDIN. Folgendes Beispiel zeigt eine sinnvolle Anwendung von cat(1)
$ cat file1 file2 | wc -l 48
Das Argument "heutzutage sind die Rechner schnell genug" zählt nicht, wenn man das in einer Schleife wiederholt:
for i in * do cat "$i" | machwas > "$i".new done
is viel langsamer als
- Höchstens, wenn es sich um sehr viele und kleine Dateien handelt
for i in * do machwas < "$i" > "$i".new done
Die nutzlose cat file | Syntax scheint attraktiv zu sein, wenn man das Ende einer Kommandozeile editiert, zum Beispiel wenn man eine Datei nach verschiedenen Mustern durchsucht. Shells erlauben jedoch, die Datei vor dem Kommando zu öffnen. Das vereinfacht es das Suchmuster zu editieren.
$ < file grep foo $ < file grep bar
Außerdem kann eine cat irgendwas-for-Schleife durch eine while-read-Schleife ersetzt werden. Außerdem kann eine while-read-Schleife leichter erweitert werden.
$ for i in `cat input`; do echo $i; done a b c $ while read i; do echo $i; done < input a b c $ (echo a b; echo c d) | \ while read one two; do echo $two $one; done b a d c
Diskussion
Die Lesbarkeit ist mit cat aber meist deutlich höher und für mich Grund genug, es anstelle von Umleitungen einzusetzen. -- RonnyBuchmann 2004-11-08 18:25:59
Nicht immer jedoch ist ein cat file | falsch. Ist file z.B. eine Gerätedatei oder eine Fifo kann es Probleme mit einigen Programmen geben. Daher ist hier zwingend ein cat notwendig.
Wie waere es mit <fifo? Ich hatte damit nie Probleme, lasse mich aber gern vom Gegenteil überzeugen.
Im Gentoo Bugtracking zum Thema "implement readahead(2) into userspace to speedup boot process", http://bugs.gentoo.org/show_bug.cgi?id=64724, wurde ein neuer Rekord aufgestellt: Im dort vorgeschlagenen Skript zum mergen von readahead-dateien findet sich folgender Abschnitt:
xargs ls -ld | awk '/^-/{print $NF}' | cat > readahead-$TYPE.lst
Hier ändert der Abschnitt "| cat >" natürlich überhaupt nichts am verhalten und könnte durch ein einfaches ">" ersetzt werden.