De command line is een venster naar de volledige, fantastische kracht van je computer. Als je verlangt onder het juk van de GUI vandaan te komen of denkt dar programmeren of het beheren van machines op afstand onderdeel uitmaakt van je toekomst, dan is het leren van de Unix command line zeker iets voor jou.

Maak je geen zorgen als je denkt dat deze commando's lijken op magische spreuken, zo moeilijk is het niet. Wij laten je vandaag 10 essentiële commando's zien waarmee je kan beginnen, voor je het weet zijn deze cryptische commando's een tweede natuur voor je.

De basics

De Unix command line shell lijkt erg veel op de command prompt van Windows (cmd of PowerShell). De commando's die wij laten zijn zullen werken op elk Unixachtig systeem, inclusief Linux, Darwin (de basis van MacOS), FreeBSD en zelfs Windows met iets als Git Bash of de nieuwe Bash shell in Windows 10. De opties en output zullen iets afwijken van elkaar maar je zal geen problemen moeten tegen komen.

Als aller eerst zal je een shell moeten openen, dit wordt soms ook een terminal window genoemd. Unix distributies zetten deze vaak onder de Administration of Systeem menus. In de gemiddelde grote Linux-distributie staat deze bij applicaties of kan de terminal geopend worden met CRTL + ALT + T. In macOS vind je de terminal in Applications > Utilities > Terminal. Dat ziet er ongeveer zo uit:

Bovenin zag je het type shell staan, in dit geval is dat Bash (Bourne Again SHell), de shandaard shell in macOS en de meeste Linux distributies. Je zag in de screenshot verder de prompt (in dit geval is deze geconfigureerd om de naam van de machine weer te geven (mercury), de naam van de huidige directie waar je je bevindt (In dit geval zie je alleen een tilde, ~, wat een "afkorting" is voor de home directory van de gebruiker), de naam van de gebruiker en ten slotte het prompt symbool (de $). Het uiterlijk van de prompt verandert als je door het bestandssysteem navigeert of van gebruiker (root, superuser of andere gebruiker) Zo kan je makkelijk zien waar je je bevindt op de machine.

Het is goed om te weten dat er twee grote smaken zijn van de Unix shell: Bash en C shell. Bourne zijn allebei afgeleid van de originele AT&T Unix shell. De C shell komt van de universiteit van California in Berkeley en BSD Unix. The Bourne en C Shell-afgeleiden zijn goed voor interactief werk in de terminal. De POSIX standaard shell, de Korn shell, is handig als je eigen programma's schrijft in de shell genaamd scripts. We gebruiken Bash shell voor de voorbeelden in dit artikel.

De Shell omgeving

Een van de eerste dingen die je moet begrijpen over de Unix command line is dat deze shell in z'n eigen omgeving werkt. Weten hoe je deze omgeving naar je hand kan zetten is een belangrijk onderdeel van het efficient kunnen werken op de command line. Je kan kijken hoe deze omgeving eruit ziet door het env-commando in te typen.

Maak je geen zorgen als je niet weet wat al deze omgevingsvariabelen betekenen, je hoeft alleen maar rekening te houden met het feit dat ze er zijn. Wellicht dat je er al een paar herkent. Bijvoorbeeld SHELL=/bin/bash vertelt ons dat we de Bash shell gebruikt. HOME=/Users/nunez specificeert de locatie van de homedirectory van de gebruiker. Je kan deze omgevingsvariabelen wijzigen en vaak is dat zelfs nodig. Hieronder zie je een klein voorbeeldje waarin wij een omgevingsvariabele genaamd FOO opzetten en deze waarde laten weergeven.

Zoals je ziet is het gebruikelijk de variabelen in hoofdletters aan te duiden. Let goed op hoe wij omgevingsvariabelen voorzien van een $. De $ vertelt de command interpreter dat het de waarde van een variabele moet gebruiken. Zonder de $ zorgt het echo-commando alleen de naam van de variabele F00 afdrukken.

Unix commandos

Het maakt niet uit welke shell je gebruikt, wanneer je een commando intypt wordt er een Unix programma uitgevoerd. De Unix-ontwerpfilosofie is het maken van programma's die maar een ding kunnen doen maar dat ook erg goed doen. Deze programma's kunnen aan elkaar gekoppeld worden (ook wel "pipe" genoemd) om zo nuttig werk te kunnen verrichten. Laten we kijken naar een simpel voorbeeld waarin wij het aantal bestanden in de /etc directory gaan tellen (we laten je later zien hoe je naar de /etc directory navigeert).

Deze commandoreeks laat twee belangrijke concepten zien: piping en opties. Het ls-commando (equivalent aan het dir-commando in Windows) geeft de inhoud van een directory weer en wc (word count) het aantal woorden. Zie je die verticale balk tussen deze commando's? Dat is het pipe-teken ( | ) De pipe pakt de output van het eerste commando en stuurt deze door als input naar het tweede commando. Je kan zoveel commando's aan elkaar koppelen als je wilt in Unix door ze te verbinden met pipes.

Het tweede wat opvalt zijn de opties die achter elk commando staan. In Unix zijn opties normaal gesproken voorzien van een dash, -. Deze command line-opties veranderen het gedrag van een commando. Het -l commando achter ls betekent dat de directory-inhoud in het "long"-formaat moet worden weergegeven. De -l achter wc betekent dat het aantal regels (lines) moet worden geteld in plaats van het aantal woorden. Als je dit commando zou "vertalen" naar het Nedelands zou het:

Geef het aantal regels in de huidige directory weer en stuur de uitkomst naar het woord tel programma on het aantal regels te tellen.

Deze command line opties negeren vaak standaardopties die zijn ingesteld in de omgeving. Als je permanent wilt wijzigen hoe een commando zich gedraagt, kan je de omgevingsvariabelen automatisch aanpassen zodra je inlogt. Veel commando's geven je de mogelijkheid meerdere opties in een enkele string te plaatsen, bijvoorbeeld ls -la maar dat geldt niet voor alle codes. Je kan alle informatie over de opties van een commando nalezen door de handleiding (manual of "man pages") na te lezen. Wij laten je zo zien hoe dat werkt.

Het leren en gebruiken van command line-opties is een groot onderdeel van het efficiënt kunnen werken op de Unix command line. Sommige commando's hebben zoveel opties dat de documentatie vele pagina's in beslag neemt. Daar hoef je je geen zorgen over te maken. Je hebt meestal maar enkele opties nodig om een bepaalde taak uit te voeren en veel van deze opties worden alleen gebruikt als je programma's schrijft in de shell-taal.

The manual

Als je de basis en de omgeving van de command line eenmaal begrijpt, kunnen we wat dieper ingaan op het systeem. Maar laten we eerst even kijken naar de handleiding.

Een van de mooie aspecten van Unix is de hoge kwaliteit van de documentatie. Er is documentatie voor gebruikers, system administrators en softwareontwikkelaars. Je kan deze documentatie benaderen met het man-commando. Laten we beginnen met de handleiding van de handleiding (die kan je oproepen met het commando man man)

De handleidingen zijn onderverdeeld in 8 secties die4 een klein beetje van elkaar afwijken afhangend van het systeem waar je op werkt (*BSD/Linux/macOS of System V) Het is handig om de introductie te lezen van elke sectie te lezen. Dat kan je doen met het commando man -s 1 intro. Deze opdracht zorgt ervoor dat er in sectie 1 wordt gezocht naar een pagina genaamd "intro".

Als je niet precies weet welk commando je zoekt, probeer dan de opties -f en -k. man -f commando vertelt je wat voor functie het commando heeft als je de naam weert. man -k hint heeft je een namenlijst met relevante commando's die gebaseerd zijn op een of meer sleutelwoorden. Beide opties zullen zoeken naar een ingebouwde database (als deze is geconfigureerd; meestal is dat wel het geval) en relevante matches weergeven. man -k bzer zal pagina's weergeven die allemaal starten met string bz:

Het bestandssysteem

Er zijn ontzettend veel commando's beschikbaar die speciaal zijn gemaakt voor het bestandssysteem van Unix, niet zo gek natuurlijk aangezien dat de kern van het besturingssysteem is. We zagen er eerder in dit artikel al eentje voorbij komen: ls, dit commando geeft weer welke bestanden er in een directory staan:

Het ls-commando heeft een heleboel opties waarmee de output kan worden gewijzigd. De optie die we je als allereerst mee willen geven is ls -a (list all) Dit commando zorgt ervoor dat "punt"-bestanden en directories ook worden weergegeven. "Punt"-bestanden zijn bestanden die beginnen met een punt (.) en zijn standaard onzichtbaar. Deze bestanden en directories bevatten meestal configuratie-informatie of logbestanden voor het Unix systeem. Het .bash_history-bestand houdt bijvoorbeeld bij welke commando's je hebt ingevoerd in de command line.


Een minstens net zo belangrijk commando om zo snel mogelijk te leren is het cd-commando. Dit wordt gebruikt om van directory te verwisselen. Dit commando werkt praktisch hetzelfde als de Windows/DOS-variant op een verschilletje na. In Windows wordt met driveletters gewerkt (C: D: E: ) terwijl Unix-systemen met namen werkt (/home, /boot, /media/externe_hardeschijf). Alle bestanden op een Unix-systeem kunnen worden bereikt via een pad dat begint met / (de root directory) niet te verwarren met de Windows root-directory ( \ ). En je kan verschillende harde schijven "mounten" op verschillende punten in je bestandssysteem.

Voordat je gaat rondstruinen in deze omgeving willen we het nog even hebben over een ander handig commando: pwd (print working directory). Er zijn zoveel plaatsen waar je de weg kan kwijtraken in een steeds groter wordend bestandssysteem. Dit commando zorgt ervoor dat de computert je vertelt in welke directory je je bevindt. In de onderstaande screenshot laten we je zien hoe zoiets eruit ziet.

Als je het cd-commando zonder argumenten gebruikt, kom je automatisch weer in je home directory terecht. Daarnaast kan je de tilde ( ~ ) ook gebruiken als snelkoppeling om je home directory aan te duiden.

Nu je weet hoe je moet navigeren in je bestandssysteem, is het handig te weten hoe je de inhoud van bestanden kan bekijken. Dit kan je onder andere doen met het commando less. Dit commando geeft de inhoud van bestanden weer en met de commando's van Vi kan je navigeren door de bestandsinhoud (j om naar beneden te scrollen, k om omhoog te scrollen, h voor hulp en q om het bestand af te sluiten en te verlaten).

Je kan bijvoorbeeld kijken wat er in je /etc/passwd-bestand staat door less /etc/passwd te typen:

Het passwd-bestand bevat informatie over de gebruikersaccounts op een Unix-systeem samen met bijbehorende gebruikers-ID's, home directory en het pad naar het bijbehorende commando of shell. Als je macOS gebruikt zie je echter alleen systeemservice-accounts in passwd staan. Dat komt omdat gebruikersaccounts op een andere manier worden bijgehouden op het besturingsststeem.

Schijfruimte

Er zijn twee commando's waarmee je makkelijk kan checken hoeveel schijfruimte je nog vrij hebt en welke bestanden de meeste ruimte in beslag nemen: du (disk usage) en df (disk free). Beide kunnen worden uitgebreid met het -h argument (human readable) om de weergave wat overzichtelijker te maken.


We focussen ons nu alleen even op de "%iused" en "mounted on"-kolommen. Deze geven (in de onderstaande screenshot) weer dat je home directory 92 procent vol is. Maar hoe weet ik welke bestanden de grote boosdoeners zijn? Daar kan je du voor gebruiken:

In dit voorbeeld heb ik een extra argument meegegeven die de output limiteert tot 10 regels, anders zou du alle directories op de machine weergeven wat niet past op je scherm. In de bovenstaande screenshot zie je hoe we met de broken pipe meerdere commando's aan elkaar knopen en daardoor een mooie, specifieke output krijgen. Met dit in het achterhoofd zou je mooie scripts kunnen bouwen waarmee je bijvoorbeeld precies kan zien welke 10 directories de meeste ruimte in beslag nemen. Dat zou je bijvoorbeeld kunnen doen door het sort -commando toe te voegen en daarmee de output te sorteren.

De macOS-versie van sort kan niet overweg met du's human readable output. Door het -m argument toe te voegen aan du wordt schijfgebruik weergegeven in megabyte (of -k voor kilobytes en -g voor gigabytes) en de -n en -r opties om de output numeriek en in omgekeerde volgorde mee te geven. De directory die de meeste ruimte in beslag neemt komt dan netjes bovenaan te staan.

Superusers, su en sudo

Een groot deel van de commando's is bedoeld voor het beheren van je systeem. Met man -s 8 intro krijg je een mooie introductie te zien. Een van de essentieelste commando's voor het beheren van je systeem is su. Dit staat voor "super user" en verwijst naar de administrator of het root-account. Alle bestanden op het systeem zijn eigendom van deze gebruiker en je kan dus alleen als deze gebruiker administratieve taken uitvoeren.

Een gerelateerd commando is sudo. Dit commando zorgt ervoor dat je voor een enkel commando (of een korte tijd) super user kan worden. Waarom zou je sudo gebruiken in plaats van su? Omdat het eigenlijk niet de bedoeling is dat je standaard op je systeem werkt als root-gebruiker. Als deze gebruiker kan je namelijk makkelijk je systeem slopen.

Probeer daarom zoveel mogelijk handelingen uit te voeren als normale gebruiker en word alleen super user als dat hard nodig is. Laten wij eens kijken hoe je super user wordt op macOS:


Het wachtwoord is correct ingetypt, toch lukt het niet om super user te worden. Dat komt omdat de huidige gebruiker, nunez, geen toestemming geeft om su te worden. Op sommige Unix-systemen betekent dat dat de gebruiker in de wheel-group moet zitten. Op andere systemen, waaronder macOS, moet deze in het sudoers-bestand zitten.

Wij laten je zien hoe je nunez toevoegt aan sudoers op de command line. Power users zweren bij Vim of Emacs, maar in dit voorbeeld gebruiken we Nano. Deze editor is makkelijk te gebruiken en wordt standaard meegeleverd macOS en veel Linux-distributies.

Natuurlijk kan niet elke gebruiker zomaar rommelen in het sudoers-bestand, dat mag alleen iemand met root privileges. We moeten dus het nunez-account uitloggen en inloggen met het administrator-account. Eenmaal ingelogd als administrator of root voer je het commando sudo nano /etc/sudoers uit en de editor opent direct het sudoers-bestand.

Navigeren in Nano kan met de pijltjes toetsen. Als je van nunez een sudoer wilt maken, zal je moeten scrollen naar de "User privilege specification"-sectie en de tekst nunez ALL-(ALL) ALL dat komt overeen met het root en %admin


Na het toevoegen van die regel druk je op de ctrl-knop en x en kies voor (of typ) yes om de wijzigingen op te slaan en Nano af te sluiten. Je kan nu weer uitloggen en inloggen als nunez en we laten je zien hoe je sudo kan gebruiken:


Zoals je ziet is het niet gelukt een bestand toe te voegen aan de / directory (deze is namelijk eigendom van root). Maar als je het sudo-commando ervoor plaatst, werkt het wel.