Subsections

6 Forelesning 6/2-(2 timer). Munin, for, argumenter

6.1 Sist

6.2 Dagens faktum: X windows system/X11

Man kan logge inn på hvilken som helst Unix host i verden (man har tilgang til) og få alle vinduer sendt til skjermen man sitter ved.

group76@ubuntu:~$ ssh -X os@studssh.iu.hio.no
os@studssh.iu.hio.no's password: 
[os]studssh:~$ xload
- xload vinduet tegnes på din skjerm. Opsjonen -X skrur på X11 forwarding. For å skrive til en skjerm, ber man X-serveren om lov.

6.3 while

syntaks:


while test
do
     kommandoer
done

Eksempel; alternativ måte å behandle argumenter: bedre hvis "strenger med mellomrom" er blant argumentene


#! /bin/bash

while [ $# -gt 0 ]  # Så lenge det er noe i $*
do
        echo "arg: $1"
        shift          # skyver ut $1 og legger neste argument i $1
done

Deamon-eksempel

#! /bin/bash

while [ "true" ]  # evig løkke; en streng er alltid 'sann'
do
        echo "Running $0, a process with PID $$"
        # Kan være nyttig for å lage entydige filnavn
        sleep 5   # sover i 5 sekunder
done

6.4 Input fra bruker


#!/bin/bash 

echo -en "svar: \a" # -n dropper linjeskift
read answer
echo "Du svarte $answer"

opsjonen -e muligjør bruk av kontrolltegn som \a, som gir ett pip.

6.5 Lese filer og output med while og read

Veldig ofte ønsker man å gå igjennom og prosessere en fil eller tekstoutput fra en kommando linje for linje. Da kan while brukes til å lese input og read til å behandle linje for linje, read.bash:

#! /bin/bash

i=0
while read LINE 
do
   (( i++ ))
   echo "Linje nr $i: $LINE"
done
read leser linje for linje fra STDIN slik at

$ read.bash < /etc/passwd
vil lese passordfilen. read LINE returnerer 0 (alt OK) helt til EOF og da stopper while.

IFS kan endre hvordan read leser inn dataene og filen kan også sendes til read inne i scriptet::


#! /bin/bash

#haugerud:x:285:102:Hårek Haugerud:/iu/nexus/ud/haugerud:/bin/bash
IFS=:
while read brnavn x ID GR NAVN HOME SHELL 
do
   echo "$brnavn: $NAVN"
done < /etc/passwd

read leser fra STDIN og dit kan linjene også sendes med en pipe:

#! /bin/bash

#haugerud 16662  0.0  0.1  2256 1280 pts/2    S    12:52   0:00 /bin/bash

# Sender all output fra ps aux til \verb+read+:
ps aux |  
   while read bruker PID x x x x x x x x prog
   do
      if [ "$bruker" = "haugerud" ]
      then
         echo "ProsessID = $PID $prog"
      fi
   done

6.6 sort

I tillegg til at man kan sende output fra en Unix-kommando inn til input for en annen, kan man også legge til en rekke opsjoner. På denne måten kan man få til veldig mye med enlinjers sammensatte kommandoer. Manualsiden til sort avslører at opsjonen -k gjør at man kan velge hvilken kolonne man vil sortere med hensyn på, mens -n gjør at man sorterer numerisk slik følgende eksempel viser. Utgangspunktet er filen biler som ser slik ut:

$ cat biler
student bmw 500000
haugerud berlingo 150000
kyrre elbil 90000
Denne filen kan man nå sortere som man ønsker med de rette opsjoner.

6.6.1 Sortert alfabetisk


$ sort biler
haugerud berlingo 150000
kyrre elbil 90000
student bmw 500000

6.6.2 Sortert alfabetisk etter andre kolonne


$ sort -k 2 biler
haugerud berlingo 150000
student bmw 500000
kyrre elbil 90000

6.6.3 Sortert numerisk etter tredje kolonne


$ sort -n -k 3 biler
kyrre elbil 90000
haugerud berlingo 150000
student bmw 500000
Default sender sort output til shellet, hvis man ønsker at reaultatet skal lagres i en fil må man be om det

 sort -n -k 3 biler > sortertFil

6.7 head og tail

Hvis man ønsker å se kun de 6 første linjene av en utgave av passordfilen på studssh sortert etter femte kolonne kan man bruke head for å få til det:

studssh:~$  sort -t: -k 5 /etc/passwd | head -n 6
aasej:x:2748:1001:Aase Jenssen:/iu/nexus/uc/aasej:/bin/bash
s137153:x:2603:100:Aasmund Solberg:/iu/cube/u2/s137153:/bin/bash
s103726:x:1089:100:Abdi Farah Ahmad:/iu/cube/u3/s103726:/bin/false
s133988:x:1695:100:Abdi Hassan Abdulle:/iu/cube/u2/s133988:/bin/bash
s123860:x:1090:100:Abdinasir Omar Kahiye:/iu/cube/u2/s123860:/bin/bash
s141546:x:3449:100:Abdiqadir Said Jama:/iu/cube/u3/s141546:/bin/false
Legg merke til at -t: gjør at tegnet : betraktes som skilleledd mellom kolonnene. Evalueringen av en slik pipeline går fra venstre til høyre så hvis man istedet ønsker å se en sortert utgave av de 6 første linjene, får man det med:

studssh:~$ head -n 6 /etc/passwd | sort -t: -k 5 
bin:x:2:2:bin:/bin:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
games:x:5:60:games:/usr/games:/bin/sh
root:x:0:0:root:/root:/bin/bash
sync:x:4:65534:sync:/bin:/bin/sync
sys:x:3:3:sys:/dev:/bin/sh
Kommandoen tail gir i motsetning til head de siste linjene. En spesielt nyttig bruk av tail er for å se på slutten av log-filer. Hvis man i tillegg tilføyer opsjonen -f vil man kontinuerlig følge med på om det kommer nye linjer til logfilen, for eksempel slik:

 sudo tail -f /var/log/auth.log

6.8 Oversikt over shell-typer

Det finnes mange forskjellige typer shell og det shellet som nå brukes her ved skolen er bash (vi skiftet fra tcsh i 2001). Det er en forbedring og utvidelse av det originale Unix-shellet Bourne Shell (sh)

Bourne-shell type C-shell type
sh Bourne-shell, Det opprinnelige Unix-shell csh C-shell, C-syntaks
bash Bourne-again-shell, forbedret sh tcsh forbedret csh, bedre interaktivt
ksh Korn-shell, utvidet sh, mye fra csh    

Under Linux:
group10@ubuntu:~$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 2008-06-08 23:34 /bin/sh -> dash
Debian Almquist shell (dash) er et mindre og hurtigere shell enn bash. Det ligger nærmere det originale Bourne-shell og har for Ubuntu blitt brukt som Bourne-substitutt siden 2006.

6.9 Oppstartsfiler

Hver gang et nytt terminalvindu (f. eks. xterm) startes, startes bash og du får et prompt som du kan taste inn kommandoer ved. Hver gang bash startes leses en konfigurasjonsfil som ligger øverst i brukerens hjemmemappe og heter .bashrc. Alle kommandoer som står der blir utført. Hver gang du logger inn, utføres kommandoene i /etc/profile og ~/.bash_profile.

Et nytt shell startes hver gang

Shellet utfører først kommandoer i noen oppstartsfiler: Ved innlogging fra grafisk terminal (X, kdm) I disse filene kan f. eks. definisjoner av shell-variabler og alias'er legges.// Eksempel på innhold:

PS1="\h:\w$ "
alias move=mv
alias cp="cp -i"
Legges dette i ~/.bashrc vil move alltid bety mv og promptet blir:
              
$ bash                 
cube:~/www/os$ exit    
exit                   
$ source ~/.bashrc     
cube:~/www/os$

source starter ikke et nytt shell, men utfører alt i det eksisterende shellet.

Spørsmål

Hvordan fjerne et alias?
Svar: med unalias: unalias move

6.10 Kommandoer brukt under forelesningen

Kommandoer

6.11 pr-plugin


#!/bin/bash

if [ "$1" = "config" ]; then
	echo 'graph_title Antall Prosesser på os2.vlab'
        echo 'graph_vlabel Antall Prosesser'
        echo 'graph_info Viser totalt antall prosesser på os2.vlab '
        echo 'graph_category OS' 
        echo "graph_printf %3.0lf";
        echo 'os2PR.label Antall prosesser'
        echo 'os2PR.type GAUGE'
        exit 0
fi

res=`ps aux | sort | uniq | grep -v 'ps aux' | grep -v uniq | wc -l`
echo "os2PR.value $res"
exit 0

6.12 svar.sh


#!/bin/bash

echo -en "svar: \a"
read answer
echo "Du svarte $answer"
exit 0

6.13 test.sh


#!/bin/bash

while [ $# -gt 0 ]
do
 echo "arg: $1"
 shift 
done



root 2012-05-07