3 Tools

  • Inleiding

    Opnieuw gaan de handschoenen uit, en werken we met een CLI (command line interface). We gaan ons wat meer verdiepen in de ideeen die aan unix en linux ten grondslag liggen. We bekijken de mogelijkheden van de command interpreter, ook wel shell genoemd. En bestuderen enkele tools uit de linux toolbox. Ook kijken we hoe we vat kunnen krijgen op programma's in uitvoering ((processen).

     

  • De shell

    De command interpreter onder Unix heet shell. Er zijn diverse smaken in omloop; de standaard shell heet Bourne shell, genoemd naar de ontwerper. Daarnaast zijn er de C-schell, korn-shell, esh etc. Linux gebruikers passen meestal de vernieuwde Bourne shell met de naam bash toe (bash = borne again shell). Als bij het inloggen een shell wordt opgestart, wordt in de HOME-directory eerst gezocht naar de file .profile. Deze file wordt door de shell uitgevoerd. (vgl AUTOEXEC.BAT van DOS). Voor bash bestaat er een aantal files, die de werking van de shell bepalen. Deze bestanden hebben een naam die begint met een punt. Gevolg hiervan is dat ze normaal niet door ls weergegeven worden. Het commando ls -a doet dat wel. Voor bash vinden we: .bash_history .bash_logout .bash_profile .bashrc De eerder genoemde .profile heet dus voor bash .bash_profile.

    Na inloggen verschijnt de $-promt van de shell op het scherm In principe zijn er nu drie communicatie kanalen open: stdin leest van het toetsenbord, stdout schrijft naar het scherm en stderr schrijft ook naar het scherm.
    Let op: afhankelijk van de implementatie kan de promt er wel eens anders uitzien. Een aantal shell variabelen zijn te zien met het commando set.
    Let op: Unix maakt onderscheid tussen hoofd en kleine letters. SET is dus iets heel anders dan set.

    Opdracht: Log in en zoek uit wat je HOME directory is. Bekijk de shell variabelen met set.

    De variable PATH geeft aan in welke directories naar commando's gezocht gaat worden. Als je wil weten uit welke subdirectory van je PATH het commando komt kun je het commando which
    Tik maar eens in: which ls

    Opdracht: Kijk waar je in het filesysteem zit met het commando pwd.

     

  • Eenvoudige commando's

    We geven hier een korte herhaling van een aantal commando's die we in sessie 1 al tegen gekomen zijn.

    informatie

    • ls geeft en lijst van files in de huidige directory (workdirectory). De vlag -l toegepast bij ls geeft een meer uitgebreide lijst Van elke file worden nu ook de leesrechten, schrijfrechten en executierechten voor resp. de eigenaar, de users uit dezelfde groep als de eigenaar en de rest van de gebruikers gegeven. Hier blijkt de multi-user eigenschap van Unix. Van elke file is in te stellen wie er wat mee mag doen. Een commando optie noemt men ook wel vlag (zoals hier dus -l), vrijwel alle vlaggen worden in Unix voorafgegaan door een min-teken. Let er ook op dat tussen de ls en de -l een spatie staat. ls-l is namelijk in Unix een geldige filenaam. Er wordt dan via het PATH naar het bestand ls-l gezocht en dit zal meestal niet gevonden worden.

       

    • man is een on-line help commando. Man drukt de Unix manual pagina van een commando op het scherm af, probeer eens man ls. Let op: op niet alle systemen zijn de manuals aanwezig.

     

    filemanipulatie

    • cp filenaam nieuwenaam
      kopieert de inhoud van filenaam naar een bestand met de naam nieuwenaam. opdracht: controleer deze bewering met het commando man cp}
    • rm filenaam
      verwijdert filenaam. Dit commando kan een hele lijst van filenamen meekrijgen.

     

    veel gebruikte commando's

    • cd werkt bijna hetzelfde als de MS-DOS variant. cd alleen (dus zonder een directory op de commandoregel) doet een change directory naam HOME.
    • pwd
      print de huidige directory.
    • who geeft aan wie er allemaal op het systeem ingelogd zijn.
    • cat filenaam
      stuurt de inhoud van filenaam naar het beeldscherm (stdout) Wanneer cat meer filenamen aangeboden krijgt worden de file-inhouden achter elkaar geplakt en naar het scherm gestuurd (cat staat voor: concatenate).
    • less zorgt ervoor dat output naar het scherm in hapklare brokken verschijnt. Een alternatief voor less is het wat oudere commando more dat wat minder mogelijkheden heeft.
    • pico is een eenvoudige text-editor voor het aanmaken van ASCII-teksten.
    • vi is een meer geavanceerde editor. Vi kent twee modes: command en insertion mode. Sommige mensen kunnen hier maar niet aan wennen, anderen willen niets anders meer.
    • echo joepie
      print joepie (dit mag een willekeurige string zijn) op stdout. De waarde van shellvariabelen kan men met echo zien door ze vooraf te laten gaan door $ voorbeeld:
      echo $HOME

     

  • IO-redirection en special files

    Met het symbool > is de output naar een file te voeren. voorbeeld:
    echo hoi > aap
    
    Voer dit uit en bekijk de inhoud van aap
    echo hallo > aap
    
    idem maar nu
    echo hoi >> aap
    
    Wat is er gebeurd? Wat is nu de inhoud van aap (cat aap)? Bij een enkele >, wordt er een nieuwe file aangemaakt. Met >> blijft de inhoud van een eventueel bestaande file gehandhaafd en wordt de output er achteraan toegevoegd (append). Deze redirection werkt voor alle commando's die iets naar het scherm sturen.
    ls -l >dirlist
    
    Deze file waarnaar geredigeerd wordt kan een special file zijn zoals een file uit de /dev directory, dat wil zeggen een file die gekoppeld is aan een device De standaard input is via het < teken te veranderen

     

  • Processen

    Elk programma in uitvoering heet een process. De processen zijn te bekijken met het commando ps. Door achter een shell commando een & te tikken wordt het nieuwe process op de achtergrond gestart. Dat wil zeggen dat de shell niet wacht tot het comanndo klaar is maar direct weer klaar staat voor een nieuw commando.

    opdracht: tik het volgende in:

    while :
    do
       sleep 20
       echo gaap
    done &
    
    (toelichting: er wordt oneindige while-lus gemaakt waarin er gedurende 20 seconden wordt geslapen en waarna het woordje gaap op het scherm gezet wordt). Op het moment dat je de return intikt komt er een nummertje op je scherm. Dit is het process-nummer of ookwel Process ID (PID) van het achtergrondprocess. Tik nu ps in om de achtergrondprocessen te bekijken. Meer informatie is te verkrijgen met het commando ps axl (doe eerst een 'man ps'). Een achtergrondprocess is een signaal te sturen met het commando
    kill  PID
    
    Hierin is PID dus het process-id van het achtergrond process (zie ps commando; je moet dus een getal intypen!) Als je een achtergrondprocess hebt gestart geeft de shell eerst het pid van het achtergrondprocess alvorens de shell-prompt weer verschijnt.

    opdracht: kill het achtergrondprocess Let op: het achtergrond process is zelf ook een bash. Deze shell voert het shell programma uit en maakt op zijn beurt ook weer nieuwe processen aan (in dit geval een sleep process en een echo process). Het heeft geen zin de sleep te killen, aangezien de moedershell dan meteen een echo doet en een nieuw sleep process start. Probeer dit maar eens uit. Men zegt dat de sleep en de echo kind-processen (child processes) zijn van de achtergrond shell, die op zijn (of haar) beurt weer een child is van de shell waarin je het commando hebt ingetikt.

    Het vorige achtergrondprocess schreef telkens output naar het scherm dus het interfereerde op hinderlijke wijze met de shell Tik nu het volgende meerregelig shell-commando in

    while :
    do
       sleep 20
       echo gaap >> gaapfile
    done &
    
    De ouput wordt nu 'geredirect' naar een file. Bekijk met ls -l de directory. Is de filegrootte van gaapfile constant? Waarom gebruikt het commando >> (bedenk het is een while-lus die elke keer doorlopen wordt) Opmerking: soms zijn processen niet met kill alleen te killen, gebruik dan We hebben dan een zwaardere kogel nodig. deze wordt als vlag aan kill meegegeven. (eigenlijk geeft kill een signal naar een process. Het signal 9 is het KILL signal)
    kill -9 pid
    
    Een gebruiker kan alleen zijn eigen processen killen. Alleen de superuser kan alle processen killen.

     

  • Pipes en filters

    Opnieuw wat commando's

    Bekijk met met man commando de werking van de volgende commando's: (dus man wc, man sort en man grep)
    • wc (word count)
    • sort (sorteert)
    • grep (zoek tekst in file)
    wc /etc/passwd
    
    telt het aantal characters woorden en regels in een file met naam passwd in de directory etc die weer een subdirectory is van de rootdirectory /. In het volgende voorbeeld zijn twee processen via een pipe gekoppeld. In zo'n geval wordt de output van het eerste process gekoppeld met de input van het tweede process. De benodigde files zijn: logfile, xxx, yyy en zzz. Plaats deze bestanden in je eigen HOME-directory door met de rechter muisknop op de filenaam te klikken en save link te kiezen. En voer de volgende commando's uit:
    cat xxx yyy zzz | sort
    
    de inhoud van xxx, yyy en zzz wordt met cat aan elkaar gekoppeld, terwijl sort de hele zaak sorteert De output is met redirection weer in een nieuwe file op te vangen. Deze pipelines zijn verder uit te breiden
    cat  yyy | grep yyy | wc -l
    
    hoe vaak komt er een regel met het woord yyy in de files xxx en yyy voor? Het is nu mogelijk eenvoudige zaken op een elegante manier te programmeren zonder kennis van een programmeertaal. Uitsluitend met de nu geleerde tools. Logfile is een file aan waarin meldingen van een industiele besturing zijn opgeslagen. Bekijk deze logfile met more. Uit deze logfile is met de genoemde commando's informatie te putten Er zijn normale meldingen en foutmeldingen
    1. extraheer alle foutmeldingen
    2. idem maar alleen met betrekking tot kleppen
    3. hoe vaak was er storing aan klep 3?
    Geef voor alle bovengenoemde vragen een Linux commando dat het antwoord geeft.

    Scripts

    Shell commando's zijn in een text-file te plaatsen en kunnen dan als batch-file uitgevoerd worden. opdracht: maak met pico of vi (als je dat aandurft) een bestand aan met de naam poging. Zet hierin een aantal shell coammndo's en sluit de edit sessie af. Maakt de file executeerbaar met het commando
    chmod +x poging
    
    Voer vervolgens het script uit en controleer het resultaat. Let op: als PATH niet een verwijzing naar de huidige directory bevat, moet je het commando vooraf laten gaan door ./ (hier dus ./poging). Op deze wijze zorgt je ervoor dat de shell het commando vindt.

     

  • Wildcards

    Linux en bash kunnen prima met wildcards overweg.
    • * willekeurig stuk van een filenaam
    • ? willekeurig teken van een filenaam
    • [ ] tussen haken staat een verzameling tekens, waarvan een enkele gekozen wordt.
    • \c met een backslash kan een speciaal karakter ontdaan worden van zijn betekenis.
    Voorbeelden:
    ??? matcht alle filenamen van drie tekens.
    *.c matcht alle filenamen die eindigen op .c
    *.[ch] match alle filenamen die eindigen op .c of op .h
    hallo\? matcht de filenaam hallo? (maar niet hallo!)

    Opdracht: experimenteer met * ? [ en ]

     

 

Wat heb je geleerd?

  • De volgende shell commando's: ls, cp, rm, cd, pwd, who, cat, less, echo, kill, sleep, wc, sort, grep, chmod, mount, man
  • Je kunt de betekenis van de verschillende opties van de commando's achterhalen m.b.v. het man commando.
  • Je kunt de betekenis achterhalen van nog onbekende shell commando's m.b.v. man.
  • Je kunt tekstfiles aanmaken m.b.v. nano of vi.
  • Je hebt kennis gemaakt met IO redirection.
  • Je hebt kennis gemaakt met het pipe mechanisme.
  • Je kunt shellcommando's groeperen in eenvoudige shell scripts.
  • Je kunt processen opsporen en killen (als je de eigenaar bent)
  • Je kent de betekenis van wildcards.

 

Opdrachten thema 3

  1. Beschrijf de betekenis van de volgende commando's:
    1. ls -lisaf
    2. ls ..
    3. grep test /etc/passwd
    4. cat file.txt | wc -w (file.txt is een gegeven tekstbestand)
    5. cat file.txt | cut -c 1-3 | sort
  2. Voer de opdrachten bij het onderdeel Pipes en filters uit.
  3. Schrijf een shell script genaamd
    1. ... tel, dat na aanroep op het beeldscherm aangeeft hoeveel accounts er op de machine zijn.
    2. ... zoek, dat na aanroep d.m.v. zoek pietje de regels in /etc/passwd afdrukt waarin pietje voorkomt. (tip: binnen dit script kan je de variabele $1 gebruiken, die bij het starten van zoek pietje, de waarde pietje overneemt.
    3. ... hoeveel, dat op het scherm weergeeft hoeveel mensen op dit moment ingelogd zijn (tip: onderzoek eerst het commando w)

     

Aangemaakt 7 juli 1999
Laatst bijgewerkt januari 2016