Cat (Unix)

cat (/bin/cat, /usr/bin/cat) ist ein Systemprogramm in Unix- und unixartigen Systemen. Der Name leitet sich vom englischen Verb concatenate bzw. dessen Synonym catenate ab (im Deutschen etwa ‚zusammenhängen‘, ‚zusammenketten‘, ‚verketten‘). cat liest die als Argumente angegebenen Dateien und gibt den Inhalt auf stdout aus.

Spezifikation und Funktionsweise

Der Funktionsumfang wie auch das Verhalten von cat ist sowohl durch die Single UNIX Specification wie auch den POSIX-Standard festgelegt.[1]

Das Verhalten von cat hinsichtlich Signalen, Rückgabewerten und Aufrufsyntax ist dem POSIX-Standard entsprechend und für ein Kommandozeilen-Programm typisch.[1][2] Eine oder mehrere Dateien, deren Namen als Argument übergeben werden, werden gelesen und in einem zusammenhängenden einzelnen Datenstrom ausgegeben. Vorgeschrieben ist insbesondere, dass Dateien in jener Reihenfolge in der Ausgabe erscheinen, in der sie als Argument übergeben werden.[1] Die Ausgabe erfolgt immer auf stdout und kann von dort mit den üblichen Mitteln (Redirection, Pipeline) umgeleitet werden. Wie bei vielen anderen Unix-Systemprogrammen repräsentiert ein einfacher Bindestrich („-“) als Dateiname stdin.

Jede Datei kann auch mehrmals als Argument übergeben werden. Dann erscheinen ebenso viele Kopien ihres Inhalts in der Ausgabe. Mit der Option -u kann die ungepufferte Ausgabe erzwungen werden, was dann von Vorteil sein kann, wenn aus FIFOs gelesen wird.

Verwendung

Die vermutlich häufigste Verwendung des Kommandos cat – nämlich mit einer einzigen Datei als Argument – ist eigentlich ein Missbrauch (siehe unten). Richtig verwendet führt cat Dateien zusammen. Damit entspricht es der Funktion von copy /b … + … in von MS-DOS abgeleiteten Systemen oder auch dem Befehl type unter VMS, CP/M, MS-DOS, OS/2 und Microsoft Windows.

Das Beispiel gibt den Inhalt der zwei angegebenen Dateien nacheinander aus (erst file1, dann file2), danach die von stdin (dafür steht das - ) bezogene Eingabe. Die Ausgabe ist ein einheitlicher Datenstrom der nacheinander aus den drei Quellen gespeist wird und die Ausgabeumleitung sorgt dafür, dass das Ergebnis in der Datei outfile abgelegt wird.

cat /path/to/file1 /path/to/file2 - > /some/outfile

Siehe auch: split (Unix) und join (Unix)

Es ist ein weit verbreiteter Irrglaube, dass cat für Textdateien genutzt werden soll. Zwar wird die Funktionsweise durch die Internationalisierungs-Variablen (LANG, LC_ALL etc.) beeinflusst, der POSIX-Standard legt allerdings ausdrücklich fest, dass cat jede Form von Eingabedatei verarbeiten kann.[1]

Erweiterungen, Varianten

Abweichend vom POSIX-Standard bieten manche cat-Implementierungen Erweiterungen des ursprünglichen Funktionsumfanges. Die cat-Version der GNU-Initiative etwa kann Zeilennummern ausgeben, nichtdruckbare Sonderzeichen druckbar umschreiben und dergleichen. Die Verwendung solcher Erweiterungen in Scripten schränkt deren Verwendungsmöglichkeit allerdings auf die sie unterstützende Ursprungsplattform ein, weshalb dies im Allgemeinen als schlechter Scripting-Stil betrachtet wird.

Insbesondere die Option -v (nicht druckbare Zeichen druckbar umschreiben) war Thema der Präsentation UNIX style, or cat -v considered harmful von Rob Pike auf der Usenix Summer Conference 1983. Der Vortrag wurde von einem, gemeinsam mit Brian W. Kernighan verfassten Paper Program Design in the UNIX Environment[3] begleitet, das seinerseits zu dem von Pike und Kernighan gemeinsam verfassten Standardwerk The UNIX Programming Environment[4] führte.

Einige Utilities, die ähnliche Funktionen wie cat bieten, nehmen durch ihre Namensgebung auch direkt Bezug darauf. zcat gibt Dateien aus einem mit gzip gepackten Archiv auf stdout aus. tac arbeitet wie cat, gibt aber die Dateien von hinten nach vorne aus.

Unnötige Verwendung, Useless Use

Weil cat die Möglichkeit bietet, auch eine einzelne Datei als Argument zu übergeben, wird es oft dazu missbraucht, den Inhalt einer Datei als Datenstrom auszugeben. Das ist allerdings schlechter Stil, da man dafür besser eine Redirection („<“) benutzen oder die Datei als Argument übergeben sollte. Auf diese Art wird ein unnötiger Aufruf der Systemcalls fork() und exec() vermieden, der für den Aufruf von cat notwendig wäre. Dieser Gebrauch ist so weit verbreitet, dass sich dafür im Usenet (insbesondere comp.unix.* und comp.os.unix.*) der Begriff useless use of cat, (auch kurz UUOC bzw. Variationen davon) herausgebildet hat.[5]:

cat /path/to/file | grep "something"       # useless use of cat
grep "something" /path/to/file             # korrekter Aufruf, Dateiname als Argument

cat /path/to/file | cmd arg1 arg2 argN     # useless use of cat
cmd arg1 arg2 argN < /path/to/file         # korrekter Aufruf, Redirection

Vorwiegend in der britischen Hackerszene ist auch der Begriff Demoggification für Kampagnen zur Ausmerzung solcher Scriptfehler verbreitet, was sich von britischen Slangausdruck moggy (Weiterbildung von mongrel, Mischling, ohne Stammbaum) herleitet und eine Katzen-Promenadenmischung bezeichnet. Demoggification ist also die Entfernung von nicht-besonderen Katzen.

Rezeption in der Unix Culture

Auf dem Gleichklang von cat und „cat“ (Katze) beruhten und beruhen viele ironische Formulierungen: die schon erwähnte Demoggification oder etwa, wenn sich jemand als Herder of Useless Cats (Hirte unnützer Katzen) bezeichnet.[6]

Auch die oftmalige falsche Verwendung und das für Unix-Utilities typische spartanische Interface wurden oft zur Zielscheibe eines selbstironischen Humors. Das Jargon File etwa meint im Lemma cat:

„Among Unix fans, cat(1) is considered an excellent example of user-interface design, because it delivers the file contents without such verbosity as spacing or headers between the files, and because it does not require the files to consist of lines of text, but works with any sort of data.

Among Unix haters, cat(1) is considered the canonical example of bad user-interface design, because of its woefully unobvious name. It is far more often used to blast a file to standard output than to concatenate two files. The name cat for the former operation is just as unintuitive as, say, LISP's cdr.“

„Unter Unix-Fans wird cat(1) als hervorragendes Beispiel für das Design einer Benutzeroberfläche betrachtet, weil es den Dateiinhalt ohne weitere Gesprächigkeit wie Trennungsabstände oder Kopfzeilen zwischen den einzelnen Dateien ausgibt und auch nicht auf Dateien aus Textzeilen besteht, sondern mit jeder Form von Daten zurechtkommt.

Unter Unix-Hassern wird cat(1) als Schulbuchbeispiel für schlechtes Design der Benutzeroberfläche betrachtet wegen seines furchtbar irreführenden Namens. Es wird viel öfter dazu benutzt, mit einer Datei die Standardausgabe zu fluten als zwei Dateien zusammenzuführen. Der Name cat für erstere der genannten Tätigkeiten ist etwa so irreführend wie LISPs cdr.“

The Jargon File, v4.4.8[7]

Geschichte

Ein cat existierte bereits im AT&T-Unix Version 1. Wer der Autor war, ist unbekannt, die manpage dazu wurde von Dennis Ritchie verfasst.[8]

Einzelnachweise

  1. a b c d cat-Spezifikation der Open Group. Abgerufen am 8. Mai 2013 (englisch).
  2. POSIX Kap. 12.2 Utility Syntax Guidelines. Abgerufen am 3. Oktober 2016 (englisch).
  3. Program Design in the UNIX Environment. Abgerufen am 8. Mai 2013 (englisch).
  4. Brian W. Kernighan, Rob Pike: The UNIX Programming Environment Prentice-Hall Software Series, 1st ed. November 11, 1983, ISBN 0-13-937681-X.
  5. Useless Use of Cat Award. Archiviert vom Original (nicht mehr online verfügbar) am 23. Januar 2014; abgerufen am 8. Mai 2013 (englisch).
  6. Benutzertitel "Herder of Useless Cats". Abgerufen am 8. Mai 2013 (englisch).
  7. Das Lemma "cat" im Jargon File. Abgerufen am 8. Mai 2013 (englisch).
  8. cat(1) manpage von Mac OS X, 2004. Abgerufen am 8. Mai 2013 (englisch).