Wegwijs in de GNU/Linux-shell
Linux, of eigenlijk GNU/Linux, begint veel populairder te worden dan gedacht wordt. Niet alleen gebruiksvriendelijke distributies als Ubuntu en Mint worden steeds meer gebruikt, ook alle Android apparaten zijn gebaseerd op GNU/Linux. Tegenwoordig zijn deze uitvoeringen zo gebruiksvriendelijk dat alles met de muis en dialoogvensters ingesteld kan worden. Maar voor de mensen die meer geavanceerde taken willen uitvoeren of sneller willen werken met GNU/Linux, Mac OS X of BSD is er deze uitleg!
Inleiding
Het is aan te raden bij het lezen van dit artikel een terminalvenster open te hebben staan zodat er direct geoefend kan worden met de commando's die worden aangeboden. Let op dat er in de shell geen 'prullenbak' bestaat die het verwijderen ongedaan kan maken. Let er ook op dat er niet met 'root' ingelogd wordt als men nog niet ervaren is met GNU/Linux.
De directorystructuur en gebruikers
Voor vrijwel alles in GNU/Linux is er een bestand. Zelfs apparaten, zoals geluidskaarten en digitale camera's, hebben een virtueel bestand in de directorystructuur dat het apparaat representeert. Gelukkig is er een logische en consequente directorystructuur die ervoor zorgt dat ervaren GNU/Linux gebruikers snel de bestanden vinden die ze zoeken, ongeacht op wat voor ze computer werken.
Het absolute 'begin' waar uiteindelijk alle directory's en bestanden onderdeel van zijn wordt de 'rootdirectory' genoemd en wordt aangeduid met een '/'. Vanuit daar zijn de belangrijkste directory's als volgt:
- /home: hierin hebben alle gebruikers een eigen directory waar ze persoonlijke bestanden kunnen opslaan;
- /usr: de programmabestanden die niet veranderen, behalve bij een update of deïnstallatie;
- /var: onderdelen van de programma's die wel veranderen, denk aan websites;
- /tmp: tijdelijke bestanden, wordt geleegd bij opstarten;
- /etc: configuratiebestanden;
- /dev: apparatuur, hier hebben de verschillende apparaten hun eigen bestand;
- /mnt: gekoppelde opslagapparaten, denk aan USB-sticks;
- /proc: informatie over het besturingssysteem die uitgelezen kan worden;
- /root: home-directory voor de beheerder;
- /boot: opstartbestanden;
- /bin: bevat een soort van 'snelkoppelingen' naar de geïnstalleerde programma's;
- /sbin: hetzelfde als '/bin', maar dan programma's die alleen door de beheerder mogen worden uitgevoerd.
Zoals in de lijst te zien is hebben de gebruikers een eigen directory waarin ze hun bestanden kunnen opslaan, dit is voor een gebruiker 'irda' in '/home/irda'. Gebruikers mogen daarin zelf bestanden en directory's aanmaken, aanpassen en verwijderen zonder dat andere gebruikers daar toegang tot hebben. De meeste gebruikers mogen niet zomaar bestanden uit bijvoorbeeld '/usr' aanpassen, maar deze wel lezen of uitvoeren.
De shell
Bij vrijwel alle GNU/Linux distributies wordt een op 'sh' gebaseerde shell geleverd. Bij het starten van een terminal wordt dan ook direct deze shell gestart. Direct dan kan men beginnen met het invoeren van commando's, maar laten we eerst kijken wat er nu al op het scherm te zien is.
Voor de tekstcursor wordt de ingelogde gebruiker weergegeven, gevolgd door een apenstaartje en de hostname. Daarachter staat een dubbele punt, de huidige directory en een dollarteken of hekje.
De gebruikersnaam op ('@') de hostname spreekt voor zich. De directory achter de dubbele punt wordt soms weergegeven als een tilde ('~'), dit is de zogenaamde home-directory van de ingelogde gebruiker. Het dollarteken geeft aan dat er een gewone gebruiker is ingelogd en een hekje geeft aan dat de beheerder ('root') is ingelogd.
Navigeren, bestanden en directory's
Op dit moment bevinden we ons dus in de home-directory. Het veranderen van directory kan eenvoudig met het commando '
cd'. Als we bijvoorbeeld naar de directory 'Afbeeldingen' in de home-directory willen navigeren, typen we: 'cd Afbeeldingen'. Relatief navigeren naar de vorige directory kan ook met 'cd ..'. En navigeren met absolute paden kan ook, type dan bijvoorbeeld: 'cd /usr/share'. Eenmaal in een directory is het natuurlijk handig om de inhoud te bekijken, dit gaat met het commando '
ls'. Het opvragen van de grootte van een bestand of directory doet met met '
du'.
Bestanden kopiëren wordt gedaan met het commando '
cp'. Type 'cp' gevolgd door het bronbestand en het doelbestand: 'cp artikel1.pdf artikel2.pdf'. Ook dit kan weer met absolute paden of zelfs met gemende absolute en relatieve paden: 'cp /etc/hosts hosts' kopieert het bestand 'hosts' uit de directory '/etc' naar de huidige directory. Het verplaatsen van bestanden gaat op soortgelijk wijze met het commando '
mv' en het verwijderen van een bestand kan met het commando '
rm'.
Het blijkt dat alle veelgebruikte commando's voor het navigeren door directory's en het aanpassen van bestanden bestaan uit twee letters. Voor directory's zijn twee commando's gedefinieerd bestaande uit meer letters: '
mkdir' maakt een directory aan en '
rmdir' verwijdert een directory.
Commando-opties
Veel commando's komen met een aantal opties. Soms wil men bijvoorbeeld ook de verborgen bestanden en directory's zien na het uitvoeren van het commando 'ls'. Dit kan in dat geval door de optie '-a' mee te geven: 'ls -a'. Of als men niet alleen alle bestanden uit een directory wil kopiëren, maar ook alle bestanden in de onderliggende directory's (recursief). Dit kan dan met: 'cp -R'.
Er zijn commando's met honderden opties, gelukkig komt vrijwel ieder commando met een uitgebreide handleiding. Het opvragen van die handleiding kan natuurlijk op internet, maar deze kan ook direct worden opgevraagd in de shell. Dit kan met het commando '
man' gevolgd door het commando. 'man cp' geeft ons bijvoorbeeld een handleiding van het kopieer-commando. Een zogenaamde 'man page' heeft voor ieder commando ongeveer dezelfde opbouw, bestaande uit een korte beschrijving, syntax, een uitgebreide beschrijving van alle opties en de auteur van het commando.
Bestanden manipuleren, pipes en redirects
Op dit moment weten we hoe we navigeren en hoe we bestanden kunnen verplaatsen, kopiëren en verwijderen. Maar we willen natuurlijk ook bestanden uitlezen en aanpassen.
Het standaardcommando voor het uitlezen van een bestand is '
cat'. 'cat /etc/hosts' geeft bijvoorbeeld de inhoud van het hosts-bestand in de directory '/etc'. Aangezien de shell volledig op tekst gebaseerd is kunnen natuurlijk alleen platte tekst bestanden worden weergegeven. Bij lange bestanden is 'cat' niet handig: alle tekst scrollt in een noodvaart over het scherm. In dat geval is het commando '
more' of '
less' handiger, deze kunnen verticaal scrollen door het gevraagde bestand.
Als er uit een lang bestand één regel moet worden gehaald kan de combinatie 'cat' en 'grep' worden gebruikt. 'grep' kan regels met tekst worden meegegeven (uit een bestand bijvoorbeeld). De ontvangen regels vergelijkt 'grep' met een te definiëren woord en geeft vervolgens alleen de regels terug waarin het woord voorkomt. In combinatie met 'cat' moet hier wel een zogenaamde pipe ('|') worden gemaakt, de volledige opdracht ziet er dan als volgt uit:
- cat /etc/hosts | grep 127.0.0.1
'cat' leest het bestand '/etc/hosts' uit en geeft de informatie door aan 'grep'. Deze vergelijkt het met het woord '127.0.0.1' en geeft daarna alleen de regels weer waarin dit woord voorkomt. Erg handig als er een log-bestand moet worden uitgelezen waarin bijvoorbeeld alleen een bepaalde datum ertoe doet.
Dan het aanpassen van bestanden. Dit kan op een directe manier worden gedaan met een zogenaamde redirect ('>'). De output van een commando kan namelijk direct worden weggeschreven naar een bestand. Zo zal de opdracht 'cat /etc/hosts > hosts2' een directe kopie maken van het bestand '/etc/hosts' naar het lokale 'hosts2'. Nuttiger is het gebruik van het commando '
echo'. Dit commando doet eigenlijk niet meer dan zijn argument direct op het scherm weergeven. Maar door deze output met een redirect door te geven aan een bestand kan tekst worden opgeslagen in een bestand. De opdracht 'echo 15 > vijftien' zal het getal 15 in een bestand 'vijftien' opslaan. Andere combinaties zijn ook mogelijk: 'ls -a > filelist' geeft ons een bestand met de (verborgen) inhoud van de huidige directory. Een kleine toevoeging: met de redirect '>>' wordt er niet een bestand overschreven met nieuwe inhoud, maar wordt de nieuwe inhoud toegevoegd aan het einde van het bestand.
Het aanpassen van bestanden is met de hand natuurlijk veel handiger om te doen in een editor. Editors als '
nano', '
vi' en '
emacs' kunnen direct in de terminal worden gedraaid. Vooral eerstgenoemde is voor beginners handig. Vi(m) en Emacs kunnen veel meer, maar zijn lastiger in het gebruik.
Processen
De belangrijkste zaken met betrekking tot bestanden, directory's en het bestandssysteem zijn nu behandeld. Maar een besturingssysteem is natuurlijk meer: er lopen immers ook processen en er moeten processen worden opgestart.
Het opstarten van een programma of script dat zich bevindt in de huidige directory wordt gedaan met '
./programma', want: in de huidige directory ('.') willen we 'programma' uitvoeren. Absoluut kan dat ook: '/bin/ls' start het al bekende programma 'ls'. Het feit dat het normaal gesproken niet nodig is de directory met scheidingstekens ('/') door te geven is omdat de directory '/bin' al is gedefinieerd als programmadirectory.
Een lijst met de huidige processen kan worden opgevraagd met '
ps' en alle lopende processen worden weergeven met 'ps aux'. Aangezien er op sommige computers nogal wat processen zullen draaien komt hier het handige 'grep' weer om de hoek kijken. Als men alleen geïnteresseerd is in alle 'bash'-processen is de opdracht 'ps aux | grep bash' van toepassing.
Een handig hulpmiddel voor een overzicht van alle processen is '
top'. Dit programma geeft grafisch de meest intensieve processen, geheugen- en processorgebruik.
Processen kunnen ook worden afgesloten. Het commando '
kill' is hiervoor. 'kill' moet worden gevolgd door een 'process id' dat kan worden opgevraagd met 'ps'. Het commando '
pkill' kan soms handiger zijn, want deze moet worden opgevolgd door de naam van het proces.
Scripts
Alle bovenstaande commando's kunnen ook in een script worden gezet. Hieronder is een voorbeeld geplaatst van een script dat de inhoud van een backup-script dat alle bestanden uit de directory '/etc' kopieert naar een nieuwe map in de lokale directory.
#!/bin/bash
echo "Aanmaken van een nieuwe directory"
mkdir "backup"
echo "Kopieren van de directory /etc naar de backup-directory"
cp -R /etc ./backup
echo "Lijst aanmaken met alle gekopieerde bestanden"
ls -R -a /etc > ./backup/filelist
echo "Klaar!"
Met alle kennis uit dit artikel moet dit script nu goed te begrijpen zijn.
Lees verder