Results 1 to 6 of 6

Thread: Korte uitleg: Interaktief systeemgebruik met een Shell

  1. #1
    Join Date
    Jun 2008
    Location
    Netherlands
    Posts
    27,359

    Default 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.

    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
    Code:
    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.

    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.
    Last edited by hcvv; 23-Oct-2016 at 07:01.
    Henk van Velden

  2. #2
    Join Date
    Dec 2008
    Location
    Rotterdam (NL)
    Posts
    803

    Default Re: Korte uitleg: Interaktief systeemgebruik met een Shell

    Top dat je dit op je heb genomen, het is zeer leerzaam.
    HP Z420 Intel Xeon & Lenovo T440s Intel I7vPro
    openSUSE Tumbleweed KDE
    Raspberry PI3 met openSUSE TW en Raspbian
    Linux counter #241023

  3. #3
    Join Date
    Jun 2008
    Location
    Netherlands
    Posts
    27,359

    Default Re: Korte uitleg: Interaktief systeemgebruik met een Shell

    Quote Originally Posted by Benmh View Post
    Top dat je dit op je heb genomen, het is zeer leerzaam.
    Aardig gezegd. Maar ik hoop dat er ook opmerkingen en vragen komen (niet te veel natuurlijk).
    Henk van Velden

  4. #4
    Join Date
    Nov 2009
    Location
    Groningen, NL
    Posts
    242

    Default Re: Korte uitleg: Interaktief systeemgebruik met een Shell

    Quote Originally Posted by hcvv View Post
    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?
    Hans Schreuder

  5. #5
    Join Date
    Jun 2008
    Location
    Netherlands
    Posts
    27,359

    Default Re: Korte uitleg: Interaktief systeemgebruik met een Shell

    Quote Originally Posted by hws38 View Post
    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
    Code:
    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:
    Code:
    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:
    Code:
    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.
    Last edited by hcvv; 22-Apr-2014 at 04:35.
    Henk van Velden

  6. #6
    Join Date
    Jun 2008
    Location
    Netherlands
    Posts
    27,359

    Default Re: Korte uitleg: Interaktief systeemgebruik met een Shell

    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:
    Code:
    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:
    Code:
    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.
    Last edited by hcvv; 11-May-2013 at 10:26.
    Henk van Velden

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •