PDA

View Full Version : Korte uitleg: Interaktief systeemgebruik met een Shell



hcvv
10-May-2013, 08:57
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. lol!

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 :(

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? (https://forums.opensuse.org/showthread.php/520548-Korte-uitleg-Welk-bestand-wordt-uitgevoerd-bij-een-commando?p=2796700#post2796700) 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.

Benmh
10-May-2013, 12:36
Top dat je dit op je heb genomen, het is zeer leerzaam.:good::good:

hcvv
10-May-2013, 13:14
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).

hws38
10-May-2013, 13:38
: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?

hcvv
10-May-2013, 14:15
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 ;)
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.

hcvv
11-May-2013, 02:38
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.