Pipes en omleiding begrijpen voor de Linux Commandoregel
Twee krachtige functies van de Linux-opdrachtregelshell zijn omleiding en pipes waarmee de uitvoer (of zelfs invoer) van een programma naar een bestand of een ander programma kan worden verzonden. Mogelijk hebt u deze functies al gebruikt zonder u hiervan bewust te zijn. Wanneer u het teken " >
" in een opdracht hebt gebruikt of " |
"Dan heb je respectievelijk een omleiding of een pijp gebruikt.
Op alle Unix-achtige besturingssystemen, zoals Linux en FreeBSD, gaat de uitvoer van een opdrachtregelprogramma automatisch naar een plaats die bekend staat als standaarduitvoer (stdout). Standaard is standaard het scherm (de console) maar dat kan worden gewijzigd met behulp van leidingen en omleiding. Evenzo wordt het toetsenbord beschouwd als de standaardinvoer (stdin) en kan het, net als bij standaarduitgangen, worden gewijzigd.
pipes
Met pipes kunt u de uitvoer van de ene opdracht naar de andere leiden, waar deze als invoer wordt gebruikt. Met andere woorden, de standaarduitvoer van het ene programma wordt de standaardinvoer voor een ander.
Het " more
" commando neemt de standaard invoer en pagineert het op de standaard uitvoer (het scherm). Dit betekent dat als een opdracht meer informatie toont dan op één scherm kan worden getoond, het programma " more
" zal pauzeren nadat het eerste scherm vol is (pagina) en wacht tot de gebruiker op SPATIE drukt om de volgende pagina te zien of RETOUR om de volgende regel.
Hier is een voorbeeld van een lijst met alle bestanden, met details ( -la
) in de /dev
directory en de uitvoer naar more
. De /dev
directory moet tientallen bestanden bevatten en dus zorgen dat more
paginaten nodig zijn.
ls -la / dev | meer
Let op de - --More--
vraag aan de onderkant van het scherm. Druk op SPATIE om de volgende pagina te bekijken en druk op SPATIE totdat de uitvoer is voltooid.
Hier is nog een pijp voorbeeld, dit keer met behulp van de " wc
" (woordentelling) tool.
ls -1 / dev | wc
wc
telt het aantal regels, woorden en tekens in de standaardinvoer. Als u de parameter -l
, wordt alleen het aantal regels weergegeven, wat een goede manier is om te zien hoeveel bestanden zich in een map bevinden!
De In depth Look bij Linux's Archiving en Compression Commands tutorial heeft een voorbeeld met behulp van tar
en 7-Zip samen:
tar cvf - * | 7zr a -si somefiles.tar.7z
In dit geval geeft het koppelteken na de f
optie aan dat tar
de uitvoer naar de standaarduitvoer stuurt en niet naar een bestand. De uitvoer van tar
zal door de pijp worden gevoerd in 7zr, die wacht op invoer van standaard in als gevolg van de optie -si.
Redirection
Doorverwijzing lijkt op pijpen behalve het gebruik van bestanden in plaats van een ander programma. De standaarduitvoer voor een programma is het scherm. Met behulp van het >
(groter dan) symbool kan de uitvoer van een programma naar een bestand worden verzonden. Hier is weer een directorylijst van /dev
, maar deze keer omgeleid naar een bestand met de naam listing.txt
ls -la> listing.txt
Er zal niets op de terminal worden weergegeven omdat alles naar het bestand is verzonden. U kunt het bestand bekijken met behulp van het cat
commando (dat kan worden ingevoegd in more
) of voor het gemak kunt u alleen het more command
op zichzelf gebruiken:
meer listing.txt
Als listing.txt
al bestond, wordt het overschreven. Maar je kunt toevoegen aan een bestaand bestand met >>
zoals dit:
ls -la / home> listing.txt ls -la / dev >> listing.txt
De eerste omleiding overschrijft het bestand listing.txt
terwijl het tweede eraan toevoegt.
De cat
opdracht kan worden gebruikt om een bestand te maken met behulp van omleiding, bijvoorbeeld:
cat> atextfile.txt
Nu wordt elke tekst die u typt verzonden naar het bestand atextfile.txt
totdat u op Control-D drukt. Op dat moment wordt het bestand gesloten en keert u terug naar de opdrachtprompt. Als u meer tekst aan het bestand wilt toevoegen, gebruikt u hetzelfde commando maar met twee groter dan tekens ( >>
).
Conclusie
Veel van Linux commandoregelprogramma's zijn ontworpen om te werken met omleiding en pijpen, probeer ermee te experimenteren en te zien hoe ze met elkaar omgaan. De uitvoer van de opdracht ps
, die de huidige processen vermeldt, kan bijvoorbeeld in grep
worden grep
. Kijk of je kunt uitzoeken hoe je de processen van root in een lijst kunt opnemen.