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

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.


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.

WWW

UselessUseOfCat (zuletzt geändert am 2011-02-14 22:24:06 durch brln-4dbc170c)