Invoer en uitvoer besturen

Stdin, stdout, pipelines, en redirectie

Ieder proces heeft op z'n minst drie verbindingen met de buitenwereld. De standaard input is één bron van de data van het proces; de standaard output is een plaats waarnaar het proces gegevens stuurt; en de standaard error is een plaats waarnaar het proces zijn foutmeldingen kan sturen. (Deze worden vaak afgekort tot stdin, stdout, en stderr.)

De woorden `bron' en `plaats' zijn doelbewust vaag. Deze standaard input en -output locaties kunnen door de gebruiker worden gewijzigd; dit kan het scherm zijn, het toetsenbord, een bestand, en zelfs een netwerkverbinding. De gebruiker kan aangeven welke locaties moeten worden gebruikt.

Als je een programma vanuit de shell draait, komt de standaard input gewoonlijk vanaf je toetsenbord en standaard output en error gaan beiden naar je scherm. Je kunt de shell echter vragen deze standaardwaarden te wijzigen.

Als voorbeeld zendt de opdracht echo zijn uitvoer naar standaard output, normaal gesproken is dit het scherm. Maar je kunt het in plaats daarvan met het output redirectie teken, '>' naar een bestand sturen. Om bijvoorbeeld het woord "Hello" in het bestand mijn-bestand te plaatsen:
echo Hello > mijn-bestand

Gebruik cat of je tekstbestandpager (more of less) om de inhoud van mijn-bestand te bekijken.

Je kunt de standaard input van een opdracht wijzigen met het input redirectie teken, '<'. more < mijn-bestand bijvoorbeeld, zal de inhoud van mijn-bestand tonen. In de praktijk is dit niet nuttig; voor het gemak accepteert de opdracht more een bestandsnaam als argument. Dus je kunt heel eenvoudig aangeven more mijn-bestand en het effect zal hetzelfde zijn.

Onder de motorkap betekent more < mijn-bestand dat de shell mijn-bestand opent, en het vervolgens de inhoud doorgeeft aan de standaard input van more. more mijn-bestand, zonder het redirectie-teken, betekent dat de opdracht more een argument ontvangt, mijn-bestand, zelf het bestand opent en het vervolgens het bestand weergeeft.

Er is echter een reden voor de dubbele functionaliteit. Je kunt bijvoorbeeld de standaarduitvoer van de ene opdracht verbinden met de standaardinvoer van de andere opdracht. Dit wordt een pipeline genoemd, en het maakt gebruik van het pipe symbool, '|'.

Misschien dat je de GNU General License in spiegelbeeld wilt zien.. Hiervoor gebruik je de opdracht tac (het is cat, maar dan omgekeerd). Probeer het uit:
tac /usr/doc/copyright/GPL

Helaas gaat het te snel voorbij om het te kunnen lezen. Dus krijg je slechts een paar paragrafen te zien. De oplossing is een pipeline:
tac /usr/doc/copyright/GPL | more

Hierbij wordt de standaard output van tac genomen, wat de GPL in spiegelbeeld is, en wordt het naar de standaard input van more gezonden.

Je kunt zoveel opdrachten als je wilt aanelkaar koppelen. Stel dat je een onverklaarbare wens hebt iedere G te vervangen door een Q; hiervoor gebruik je als volgt de opdracht tr G Q:
tac /usr/doc/copyright/GPL | tr G Q | more

Je zou hetzelfde effect kunnen verkrijgen als je gebruik maakt van tijdelijke bestanden en redirectie. Als voorbeeld:
tac /usr/doc/copyright/GPL > tmpfile
tr G Q < tmpfile > tmpfile2
more < tmpfile2
rm tmpfile tmpfile2

Een pipeline is overduidelijk comfortabeler.