Pipes zijn van essentieel belang om productief te werken in de shell. Pipes combineren verschillende commando’s, waarbij de output van het ene commando dient als input van het volgende. We herhalen even kort de basics én tonen je enkele geavanceerde tricks!

  1. Eenvoudige pipe

Met het ‘|’-teken gebruik je de uitvoer van één commando (stdout) als invoer van het volgende commando (stdin). Een voorbeeld om de IPv4-adressen van je systeem op te zoeken:

$ ip addr show  | grep 'inet\b'

Uiteraard mag je zoveel pipes combineren als je wilt. Volgend voorbeeld knipt de overbodige rommel weg uit de uitvoer van het IP-commando, negeert het loopback-adres (lo) en sorteert de overige IP-adressen:

$ ip addr show | grep 'inet\b' | grep -v 'lo$' | awk '{print $2}' | sort -n
  1. Geen stdin?

Bepaalde commando’s werken meestal met bestanden in plaats van stdin en stdout. Toch kan je ook die commando’s combineren met behulp van pipes. Je gebruikt dan het min-teken op de plaats waar je normaal de bestandsnaam plaatst. Wil je bijvoorbeeld een backup maken met tar en die via ssh op een remote machine bewaren? Dat kan in één stap:

$ tar cvjf - /var/log | ssh pi2 'cat - > backup_logs.tar.bz2'

In het eerste deel van de pipe bewaren we het tar-bestand in stdout. Via de pipe kopiëren we die over ssh naar de remote machine. Daar gebruiken we cat om stdin weg te schrijven naar een bestand. Maar je kan het bestand meteen ook untarren als je dat wilt. Dan ziet de pipe er als volgt uit:

$ tar cjf - /var/log | ssh pi2 'tar xjvf -'
  1. Voortgangsbalk

Het commando uit tip 2 kan je nog verder uitbreiden met een voortgangsbalk. Dan weet je tenminste hoeveel data er al gekopieerd is en hoe snel dat gebeurt. Vooral voor grotere backups is dat wel handig! De gebruikte commando’s hoeven zelf geen voortgangsbalk aan te bieden. Er bestaat immers een algemeen toepasbaar tooltje dat de doorvoer van een stdin/stdout-pipe toont: Pipe Viewer of pv. Het is erg eenvoudig te gebruiken: installeer het pv-pakket en voeg gewoon het pv-commando in tussen de twee commando’s in jouw pipe:

$ tar cjf - /var/log | pv | ssh pi2 'cat - > backup_logs.tar.bz2'
  1. Ultimate Plumber

Het opbouwen van een complexe pipe is meestal een werk van trial-and-error. Je begint met het eerste commando, voegt een tweede toe en controleert de uitvoer, wijzigt het commando eventueel, voegt nog een commando toe, enzovoorts. Wil je dat proces vereenvoudigen, dan moet je Ultimate Plumber of up zeker eens proberen. Up is een interactieve editor om pipes te bouwen, die je gaandeweg het resultaat toont van de verschillende commando’s in de pipe. Dat werkt een stuk prettiger én sneller! Download de laatste versie van de up-binary van https://bit.ly/2Y9jlEw. Maak het bestand vervolgens executable en verplaats het naar /usr/local/bin:

$ chmod +x up

$ sudo mv up /usr/local/bin
  1. Interactieve pipes

Je start up door het eerste commando van je pipe te starten, gevolgd door |& up. Bijvoorbeeld

$ df -m |& up

Bovenaan krijg je nu een interactieve commandline om je pipe verder uit te bouwen. Het allereerste commando -de invoer voor up- zie je niet. Druk op elk moment op enter om de pipe uit te voeren en het resultaat te bekijken. Met PageUp/PageDown/Ctrl-Left/Ctrl-Right scroll je door de uitvoer en met Ctrl-c verlaat je up. Ben je tevreden met je pipe en wil je die bewaren om ‘m later nogmaals te gebruiken? Sluit dan af met Ctrl-x in plaats van Ctrl-c en up bewaart jouw pipe in het bestand up1.sh in de huidige directory. Let wel op: up werkt vooral goed voor pipes waarin stdin/stdout uit tekst bestaat. Het is niet erg zinvol om bijvoorbeeld de tar-commando’s uit tips 2 en 3 uit te voeren in up!