Pipeline (Unix)

Eine auf einem Text-Terminal laufende Pipeline bestehend aus drei Programmen mit stdin, stdout und stderr

Eine Pipeline in unixoiden Betriebssystemen besteht aus Programmen, die über ihre Standard-Datenströme miteinander verkettet sind. Dabei „empfängt“ ein Programm über die Standardeingabe (stdin) die Standardausgabe (stdout) des jeweils vorherigen Programms in der Kette. Die einzelnen Programme werden nacheinander durch das jeweils vorherige aufgerufen.[1]

In der Shell-Syntax wird ein Senkrechter Strich (|, im Unix-Jargon „Pipe“ oder „Pipe-Zeichen“ genannt) als Verkettungszeichen der einzelnen Programme verwendet:

Programm1  |  Programm2  |  Programm3

Das Betriebssystem nutzt hierbei das Prinzip der „namenlosen Pipe“, die älteste und erste Technik der Interprozess­kommunikation.[2]

Beispiel

  1. Erzeuge mittels ls -dl *key* eine Liste aller Dateien im aktuellen Verzeichnis mit der Zeichenkette „key“ im Namen.
  2. Reduziere die ausgegebene Liste mit grep -v "failed" um jene Zeilen, die die Zeichenkette „failed“ enthalten.
  3. Gebe die resultierende Liste zum seitenweisen Betrachten mit less aus:
ls -dl *key*  |  grep -v "failed"  |  less

Standardfehlerausgabe

Per Default sammelt die Pipeline die Standardfehlerausgaben (stderr) ihrer einzelnen Kindprozesse und leitet sie am Ende an die Kommandozeile weiter. Die alternative Schreibweise "|&" der C-Shell führt jedoch die Standardausgaben und die Standardfehlerausgaben der jeweiligen Kindprozesse zusammen und übergibt diese als Standardausgabe an den nächsten Prozess.[3] Ergänzend dazu leitet die Pipeline in der Bourne-Shell seit Bash 4.0 die Standardfehlerausgaben mit der Notation 2>&1 in eine Datei um.[4]

Geschichte

Douglas McIlroy stellte während seiner Zeit in den Bell Labs (der Geburtsstätte von Unix) fest, dass sehr oft Benutzer die Ausgabe-Datei eines Programms als Eingabe-Datei für ein anderes nutzten.[5] Er führte daher das Konzept der Pipe ein, welches Ken Thompson im Jahr 1973 in Version 3 Unix durch den Systemaufruf pipe() und für die Shell durch die Pipe erweiterte.[6]

Ken Thompson führte außerdem die obige Notation ein, welche die Beschreibung der Pipe-Syntax in Version 4 Unix stark vereinfachte.[7]

Viele Betriebssysteme wie DOS, OS/2, Microsoft Windows, und BeOS implementierten später die Pipeline mit identischer Notation und Tony Hoare entwickelte das Konzept der Pipeline mit CSP weiter.[8]

Das Computerprogramm Automator von Apple verkettet auch sich wiederholende Befehle mit Pipelines. Das Roboter-Icon trägt daher als Hommage an das ursprüngliche Unix-Konzept ein Rohr (Pipe) in seinen Händen.

Siehe auch

  • Everything is a file – Grundpfeiler der Unix-Philosophie, Pipelines verarbeiten Dateien im Unix-Sinne
  • GStreamer – auf Pipelines basierendes Multimedia-Framework
  • GNU parallel – parallele Verarbeitung von mehreren Shells, auch mit Daten aus Pipes
  • Tee (Unix) – Unix-Kommando zum Abgreifen von Daten einer Pipeline
  • XML-Pipeline – Verarbeiten von XML-Dateien
  • xargs – Unix-Kommando um Standardausgaben via Pipe in andere Unix-Befehle umzuwandeln
  • netcat, socat Verbindung zu TCP/IP-Internet-Sockel mittels Pipes.

Weblinks

Einzelnachweise

  1. An Introduction to Linux I/O Redirection. DigitalOcean, abgerufen am 14. September 2018 (Abschnitt Pipes).
  2. Jürgen Wolf, Klaus-Jürgen Wolf: Linux-Unix-Programmierung. Das umfassende Handbuch. 2. Aufl., Rheinwerk Verlag: Bonn, 2006, Kapitel 9.1.1.
  3. C-Shell Quick Reference. (PDF) Hamilton Laboratories, abgerufen am 14. September 2018.
  4. Bash release notes. Case Western Reserve University, abgerufen am 14. September 2018 (Bash-3.2 release:1dd).
  5. Michael S. Mahoney: The Unix Oral History Project: Release.0, The Beginning. Abgerufen am 14. September 2018.
  6. Douglas McIlroy (Bell Labs): A Research Unix reader: annotated excerpts from the Programmer’s Manual. (PDF) In: CSTR, nummer 139, 1971-1986. Abgerufen am 14. September 2018.
  7. Pipes: A Brief Introduction. The Linux Information Project (LINFO), abgerufen am 14. September 2018.
  8. Russ Cox: Bell Labs and CSP Threads. Abgerufen am 14. September 2018.

Auf dieser Seite verwendete Medien

Pipeline.svg
Simple diagram of a POSIX (Unix) pipeline of standard streams. Depicted: a text terminal, the running programs in a pipeline, the streams standard input stdin, standard output stdout, standard error stderr.