Korte uitleg: Interaktief systeemgebruik met een Shell

Interactief systeem gebruik met een Shell

Het is leuk om een draaiend systeem te hebben, maar we willen dat ook gebruiken. Hoewel bij het opstarten van het systeem al allerlei processen worden gestart Hebben we als gebruiker (en als beheerder) behoefte aan het geven van opdrachten aan het systeem als wij dat willen. In de tijd dat Unix achtige systemen werden “uitgevonden” waren er alleen “terminals” op teken/character basis. Dus een soort tikmachines met een toetsenbord en oorspronkelijk met papier om de tekens op te laten zien.

Om dat te laten werken is er dus (alweer) een programma nodig dat leest vanaf de terminal, iets doet met wat het heeft gelezen, dan iets vraagt aan de Kernel en dan de resultaten op het papier zet. Omdat het voor de gebruiker een soort van omhulling van de Kernel is, kregen deze programma’s de soortnaam Shell (schelp). De Kernel zit veilig binnen en wij hameren er van buiten op. :laughing:!

De eerste shell was de Bourne shell sh. Een uitgebreidere versie is de Korn shell ksh, maar hij is in kleine details verschillend. Een veel meer afwijkende shell is C shell csh, waarvan de syntax is geïnspireerd door de programmeertaal C. In een poging tot standaardisering onstond de POSIX shell. Tegenwoordig is dat sh. Dus sh is niet meer de Bourne shell maar de POSIX shell. Bij het ontstaan van GNU Linux was ook een shell nodig en zoals alles voor GNU nieuw is gemaakt om claims te voorkomen, maakte men ook een nieuwe Bourne again shell (een woordgrapje op de naam van Richard Bourne, maar ook een eerbewijs) bash.

Let op! De meeste mensen gebruiken op Linux bash, maar soms hebben ze de foute gewoonte om hun bash scripts door sh te laten uitvoeren. Dat gaat meestal goed, maar niet altijd :frowning:

Wat doet de shell dus voor je in de meest eenvoudige vorm? Stel je tikt

ls -l

dan vraagt de shell aan de Kernel om een kindproces te starten met als uit te voeren programma /usr/bin/ls en als argumenten ls en -l. (Als het niet helemaal duidelijk is waarom van ls gemaakt wordt /usr/bin/ls, lees dan Korte uitleg: Welk bestand wordt uitgevoerd bij een commando? met de uitleg van de PATH process environment variable.) Als de Kernel aan dat verzoek voldoet gaat het programma ls draaien en de uitvoerteksten komen zichtbaar op de terminal. So simpel is het. :sarcastic:

Maar de shell kan meer. Er zijn allerlei zaken aan toegevoegd, die programmeren mogelijk maken. Alle basis constructies van programmeren zijn er: if-then-else, loop, parameter gebruik, enz. Je kunt dus zeer ingewikkelde commando’s/statements intikken, maar als het erg ingewikkeld wordt en als je zoiets ingewikkelds vaker wilt doen, is het handiger om de zaak in een bestandje te zetten en dat bestandje ter interpretatie aan de shell aan te bieden. Eén commando met hele grote gevolgen.

Zulke programma’s worden niet gecompileerd zoals bij C, Fortran of Cobol, maar worden direct vanaf de broncode (de source) geïnterpreteerd. Nadeel is dat dat niet zo efficiënt is, maar voordeel is dat het makkelijk is te wijzigen en direct weer te proberen. Ze worden scripts genoemd en omdat dit scripts voor een shell zijn: shell scripts, beter: bash scripts.

Kortom een shell is niet anders dan een programma dat aan de gebruiker een Command Line Interface biedt om het systeem te gebruiken.

Top dat je dit op je heb genomen, het is zeer leerzaam.:good::good:

:embarrassed:Aardig gezegd. Maar ik hoop dat er ook opmerkingen en vragen komen (niet te veel natuurlijk).

Worden ook andere shells dan bash in openSUSE ondersteund? Zo ja, hoe kan een gebruiker vastleggen welke shell hij/zij wil gebruiken?

Zeker, start maar een terminal en probeer

ksh
csh
sh
zsh

Je zult zien dat ze allemaal hun eigen prompt hebben. zsh begint zelfs van alles te vragen (met q ga je eruit). Dan moet je dus heel veel exit tikken om weer terug te komen :wink:
Voorbeeld:

henk@boven:~> ksh
henk@boven:/home/henk> csh
/home/henk% sh
sh-4.2$ exit
exit
/home/henk% exit
exit
henk@boven:/home/henk> exit
henk@boven:~>

Zijn allemaal standaard geïnstalleerd.

Met YaST > Beveiliging en gebruikers > Gebruikers en groepenbeheer kun je een gebruiker kiezen en Bewerken. De Details tab heeft het veld Aanmeldings-shell.

Dit komt terecht in de /etc/passwd file. Ik heb bijv. bash:

henk@boven:~> grep henk /etc/passwd
henk:x:500:500:Henk van Velden:/home/henk:/bin/bash
henk@boven:~>

Het laatste veld. Je kunt dit ook met de hand wijzigen. Geldt vanaf de volgende login.

We gaan hier nog even op door (voor wie op deze zaterdag een extra lesje wil). Ik ben ingelogd en gebruik mijn “startup” shell bash:

henk@boven:~> ps -ef | grep henk | tail
henk      3048     1  0 10:48 ?        00:00:00 korgac --miniicon korganizer
henk      3059  2860  0 10:48 ?        00:00:00 kio_file [kdeinit] file /tmp/ksocket-henk/k  
henk      3115  2683 10 10:48 ?        00:03:10 /usr/lib64/firefox/firefox http://forums.opensuse.org/
henk      3134  3115  0 10:48 ?        00:00:00 /usr/lib/mozilla/kmozillahelper
henk      3141     1  0 10:48 ?        00:00:00 /usr/lib/GConf/2/gconfd-2
henk      4443     1  0 11:16 ?        00:00:00 kdeinit4: konsole [kdeinit] --profile Henk     
henk      4445  4443  0 11:16 pts/1    00:00:00 /bin/bash
henk      4460  4445 20 11:17 pts/1    00:00:00 ps -ef
henk      4461  4445  0 11:17 pts/1    00:00:00 grep --color=auto henk
henk      4462  4445  0 11:17 pts/1    00:00:00 tail
henk@boven:~> ksh
henk@boven:/home/henk> ps -ef | grep henk | tail
henk      3059  2860  0 10:48 ?        00:00:00 kio_file [kdeinit] file /tmp/ksocket-henk/k  
henk      3115  2683 10 10:48 ?        00:03:10 /usr/lib64/firefox/firefox http://forums.opensuse.org/
henk      3134  3115  0 10:48 ?        00:00:00 /usr/lib/mozilla/kmozillahelper
henk      3141     1  0 10:48 ?        00:00:00 /usr/lib/GConf/2/gconfd-2
henk      4443     1  0 11:16 ?        00:00:00 kdeinit4: konsole [kdeinit] --profile Henk     
henk      4445  4443  0 11:16 pts/1    00:00:00 /bin/bash
henk      4465  4445  0 11:17 pts/1    00:00:00 ksh
henk      4471  4465  0 11:17 pts/1    00:00:00 ps -ef
henk      4472  4465  0 11:17 pts/1    00:00:00 grep --color=auto henk
henk      4473  4465  0 11:17 pts/1    00:00:00 tail
henk@boven:/home/henk> 

Je ziet hierboven eerst een lijst van processen (alleen die van mij en dan nog de laatst gestarte om de lijst niet te lang te maken). Daarin heeft mijn bash de PID 4445. Je ziet als kinderen daarvan de drie commando’s die ik gebruik om de lijst te maken.

Dan roep ik ksh aan (misschien heeft je dat verbaasd in mijn vorige post, maar zoals ik in post #1 vertelde is een shell gewoon een programma). En in ksh vraag ik weer om die lijst. Je ziet nu dat ksh met PID 4465 een kind is van bash met PID 4445 en dat de drie commando’s nu kind zijn van ksh.


Maar kijk nu eens naar het volgende:

henk@boven:~> ps -ef | grep henk | tail
henk      3048     1  0 10:48 ?        00:00:00 korgac --miniicon korganizer
henk      3059  2860  0 10:48 ?        00:00:00 kio_file [kdeinit] file /tmp/ksocket-henk/k  
henk      3115  2683 10 10:48 ?        00:03:54 /usr/lib64/firefox/firefox http://forums.opensuse.org/
henk      3134  3115  0 10:48 ?        00:00:00 /usr/lib/mozilla/kmozillahelper
henk      3141     1  0 10:48 ?        00:00:00 /usr/lib/GConf/2/gconfd-2
henk      4443     1  0 11:16 ?        00:00:00 kdeinit4: konsole [kdeinit] --profile Henk     
henk      4445  4443  0 11:16 pts/1    00:00:00 /bin/bash
henk      4884  4445  0 11:26 pts/1    00:00:00 ps -ef
henk      4885  4445  0 11:26 pts/1    00:00:00 grep --color=auto henk
henk      4886  4445  0 11:26 pts/1    00:00:00 tail
henk@boven:~> exec ksh
henk@boven:/home/henk> ps -ef | grep henk | tail
henk      3048     1  0 10:48 ?        00:00:00 korgac --miniicon korganizer
henk      3059  2860  0 10:48 ?        00:00:00 kio_file [kdeinit] file /tmp/ksocket-henk/k  
henk      3115  2683 10 10:48 ?        00:03:54 /usr/lib64/firefox/firefox http://forums.opensuse.org/
henk      3134  3115  0 10:48 ?        00:00:00 /usr/lib/mozilla/kmozillahelper
henk      3141     1  0 10:48 ?        00:00:00 /usr/lib/GConf/2/gconfd-2
henk      4443     1  0 11:16 ?        00:00:00 kdeinit4: konsole [kdeinit] --profile Henk     
henk      4445  4443  0 11:16 pts/1    00:00:00 ksh
henk      4894  4445  0 11:26 pts/1    00:00:00 ps -ef
henk      4895  4445  0 11:26 pts/1    00:00:00 grep --color=auto henk
henk      4896  4445  0 11:26 pts/1    00:00:00 tail
henk@boven:/home/henk> 

Het uitgangspunt is hetzelfde (ik heb exit gedaan om ksh weer te verlaten). Maar nu gebruik ik het “shell build in commando” exec. Dit maakt gebruik van een gelijknamige library routine exec() naar de Kernel. Hierbij wordt geen nieuw kind process afgesplitst (dat gebeurt met fork() ), maar bash wordt nu door de Kernel vervangen door het aan exec opgegeven programma, in dit geval ksh. Je ziet dat ksh nu dezelfde PID 4445 heeft als eerst bash.

Als ik nu exit doe, ga ik niet terug naar bash, maar ik log echt uit.

Dit is een handige manier om eens een andere shell uit te proberen zonder dat je systeem vol komt te zitten met allerlei extra shell processen.

Prettig weekend.