Ik Van Linux

Commando's


We hebben ondertussen al heel wat commando’s gezien. Geloof me, er zijn er nog veel meer. Sterker nog, er zijn nog veel meer commando’s die nog niet eens op je computer geïnstalleerd staan. Laten we heel even stil staan waar Linux zijn commando’s heeft staan. Dat kan interessant worden wanneer we onze eigen programma’s gaan schrijven bijvoorbeeld.

In Linux is alles een bestand. Het mag daarom geen verrassing zijn wanneer ik zeg dat commando’s ook bestanden zijn.
Om te zien waar Linux al zijn programma bestanden vandaan haalt kun je het volgende commando uitvoeren:

echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games

Hiermee wordt de inhoud van de variabele PATH afgedrukt. Dit geeft een regel met directory namen waarin het systeem gaat zoeken naar het commando wat je hebt ingetoetst. De directories in het pad worden van elkaar gescheiden door een dubbele punt. In principe kun je het pad hiermee dus uitbreiden, of juist inkorten.
Dus als je een commando intypt en op Enter drukt gaat het systeem in bovenstaand geval eerst in de directory /usr/local/sbin zoeken naar dat commando. Als hij het daar niet kan vinden kijkt het in /usr/local/bin, dan in /usr/sbin, /usr/bin, /sbin, /bin, /usr/local/games en ten slotte in /usr/games. Zodra een bestand met de naam van het commando in een van die directories gevonden wordt wordt dat bestand uitgevoerd.
Ik ben een kleine stap over geslagen. Bash heeft namelijk een aantal ingebouwde commando’s. Voor die commandos’ hoeft dus niet gezocht te worden naar een bestand met die naam. Bash zoekt dus eerst in de lijst met interne commando’s en als het ingegeven commando daar niet gevonden wordt gaat het zoeken verder door het pad. De meest gebruikelijke ingebouwde commando’s zijn cd en exit. Als het goed is kennen we die al.

Er is een manier om er achter te komen welk bestand uitgevoerd gaat worden voor elk specifiek commando.

which nano
/bin/nano

Met het which (welk) commando, gevolgd door de naam van het commando wat je zoekt, kun je dus zien welk bestand verantwoordelijk is voor het uitvoeren ervan.

Wanneer een ingetypt commando niet gevonden wordt in de ingebouwde lijst van commando’s en ook niet in het pad krijg je een foutmelding:

oeioei
-bash: oeioei: command not found

Je eigen programma

Stel nu dat we zelf een programma gaan schrijven. Ik hoop namelijk dat dat je uiteindelijke doel is met de Raspberry Pi. Want er is niets leukers dan het schrijven van je eigen programma’s.
Laten we meteen maar beginnen met een eigen programma, dan zie je meteen hoe het werkt.

Open een nieuw bestand met het commando nano hallo . En plaats daar onderstaande tekst in. Je hoeft nog niet te snappen wat er gebeurt in dat programma. Technisch gezien is het geen programma maar is het een script, maar dat is even niet belangrijk.

#! /bin/bash
echo “Hallo wereld”

Sluit de tekstverwerker met Ctrl-X, Y en Enter.
Om veiligheidsredenen zijn bestanden in Linux standaard niet uitvoerbaar. Dat moeten we dus eerst even fixen.

chmod u+x hallo

Dit commando hebben we reeds eerder gezien bij Gebruikers en rechten. Bovenstaand commando kent het uitvoerrecht toe aan de eigenaar van het bestand. Alleen de eigenaar mag het commando dus gaan uitvoeren.
Dus we hebben het programma nu geschreven en uitvoerbaar gemaakt. Dan gaan we het nu uitvoeren.

hallo
-bash: hallo: command not found

Hmmm, hij kan ons programma niet gevonden krijgen. Natuurlijk, het programma wat we zojuist geschreven hebben staat niet in het opgegeven pad. Mensen die wel eens in DOS gewerkt hebben weten misschien nog dat DOS een programma ook uit kon voeren als het in het huidige pad stond. Linux doet dat, uit veiligheidsoverwegingen, niet.
Maar gelukkig kun je in Linux ook specifiek aangeven waar het programma gevonden kan worden. Dit doe je door het pad voor de programmanaam op te geven.

/home/pi/hallo
Hallo wereld

Hoera, hij doet het! Maar zo’n absoluut pad is wel lastig, als we dat elke keer op moeten geven als we ons programma uit willen voeren. Een absoluut pad begint altijd vanaf de directory root, het begint dus met een / teken. Een relatief pad is een pad wat vanaf de huidige directory begint. Dus als we een programma willen uitvoeren wat in onze huidige directory staat moeten we daar naar verwijzen. Herinner je de twee speciale directories nog? De punt en de punt,punt directories bedoel ik. De .. directory brengt ons vanaf de huidige directory een directory terug, richting de root directory. De . directory betekent eigenlijk "deze directory". Dus als we aan willen geven waar ons programma gevonden kan worden typen we gewoon:

./hallo
Hallo wereld

Er valt je misschien nog iets op. Het programma wat we geschreven hebben heeft geen extensie. Het heet dus niet hallo.bat of hallo.exe of zo. Het had wel zo kunnen heten, maar hier heet het gewoon hallo.
In Linux is dat normaal. Linux kijkt gewoon in het bestand om te zien wat hij ermee moet doen. Linux interesseert het niet, die negeert de extensie en kijkt naar de inhoud en niet naar de naam. Je had het programma ook gewoon hallo.jpg kunnen noemen. Dat is alleen voor de gebruiker verwarrend, niet voor het systeem. Het feit dat het programma uitvoerbaar is gemaakt, en dat het begint met een hele rare regel, en dat het vindbaar is in het pad of wanneer je expliciet aangeeft waar het te vinden is is voor Linux voldoende om een bestand als programma te herkennen.

Merk op dat het hele standaard pad bestaat uit directories die niet door een normale gebruiker beschreven mogen worden. Ze hebben allemaal root als eigenaar, en verder mag iedereen de programma’s alleen lezen en uitvoeren. Dat is veilig natuurlijk, maar wel ongemakkelijk voor ons, programmeurs (in de dop). Daarom is in de meeste Linux distributies een handhigheidje ingebouwd. Wanneer je in je home directory een nieuwe directory maakt met de naam bin zal die bin directory automatisch worden toegevoegd aan je pad.

cd
mkdir bin
mv hallo bin/

Dit zijn de voorbereidingen. De nieuwe directory wordt echter pas aan je pad toegevoegd wanneer je opnieuw inlogt. Log dus even uit (of sluit je terminal venster) en log opnieuw in. Nu kun je jouw eerste programma starten door gewoon de naam in te vullen. Wil je weten waar het programma vandaan komt type je weer:

which
/home/pi/bin/hallo

Gelukkig hoef je maar een keer zo veel moeite te doen om je programma uitvoerbaar te maken. Als je dat eenmaal gedaan hebt kun je het programma zo vaak en zo veel aanpassen als je wilt. Het programma blijft dan gewoon uitvoerbaar.

Je kunt ten slotte het pad ook handmatig aanpassen. Maar dat ga ik verderop nog uitleggen, als we het over variabelen gaan hebben.