cat (Unix)

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche

cat (/bin/cat, /usr/bin/cat) ist ein Systemprogramm in Unix- und unixartigen Systemen. Es wird zum Zusammenführen von Dateien benutzt. Der Name leitet sich vom englischen concatenate bzw. dessen Synonym catenate (deutsch: aneinanderhängen) ab.

Spezifikation und Funktionsweise[Bearbeiten]

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

cats Verhalten hinsichtlich Signalen, Rückgabewerten und Aufrufsyntax ist gemäß dem Standard für ein Kommandozeilen-Programm typisch. 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 ebensoviele 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[Bearbeiten]

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 bezogene Eingabe. Die Ausgabe ist ein einheitlicher Datenstrom aus den drei Quellen 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: paste (Unix), 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[Bearbeiten]

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[2] begleitet, das seinerseits zu dem von Pike und Kernighan gemeinsam verfassten Standardwerk The UNIX Programming Environment[3] 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[Bearbeiten]

Weil cat die Möglichkeit gibt, auch eine einzelne Datei als Argument zu übergeben, wird es oft dazu missbraucht, den Inhalt einer Datei in einen Datenstrom auszugeben. Dieser falsche 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.[4] Tatsächlich kostet dieses Vorgehen wegen des zusätzlich notwendigen (und in Bezug auf Ressourcenverbrauch "teuren") Systemaufrufs fork() unnütze Rechenzeit, ohne irgendeinen Vorteil zu bieten. Praktisch alle diese Konstrukte lassen sich mit Hilfe von Redirection auch ohne cat abbilden, wie die folgenden Beispiele zeigen:

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[Bearbeiten]

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.[5]

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[6]

Geschichte[Bearbeiten]

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

Einzelnachweise[Bearbeiten]

  1. a b c cat-Spezifikation der Open Group. Abgerufen am 8. Mai 2013 (englisch).
  2. Program Design in the UNIX Environment. Abgerufen am 8. Mai 2013 (englisch).
  3. Brian W. Kernighan, Rob Pike: The UNIX Programming Environment Prentice-Hall Software Series, 1st ed. November 11, 1983, ISBN 013937681X.
  4. Useless Use of Cat Award. Abgerufen am 8. Mai 2013 (englisch).
  5. Benutzertitel "Herder of Useless Cats". Abgerufen am 8. Mai 2013 (englisch).
  6. Das Lemma "cat" im Jargon File. Abgerufen am 8. Mai 2013 (englisch).
  7. cat(1) manpage von Mac OS X, 2004. Abgerufen am 8. Mai 2013 (englisch).

Weblinks[Bearbeiten]