Elõadás emlékeztetõ - UNIX

Több oldalról közelíthetõ a Unix (a megismerés szempontjából).

A Unix többfelhasználós, többprocesszes op. rendszer, esetenként egyedi, többnyire (i)x-re végzõdõ névvel. (SCO-Unix, Sinix, AIX, Xenix, Unixware, Linux, Solaris). Processz = egyedi azonosítóval(process-id=pid), "környezettel" (user, munkadirectory, környezetváltozók) rendelkezõ (rész)program. Program = parancsfájl(shell script) vagy bináris program. A ps parancs.

Daemon-ok (=háttérben futó kiszolgáló programok, pl. httpd) feladatai, foreground, background (parancs & --- pl. "sleep 5 &") parancs végrehajtás.

Editorok: vi(segédanyagok), emacs, joe, wpe.

Shell = parancs értelmezõ program. A Unix parancsok formája (parancsnév opciók fájlok).

A shell (sh, ksh, csh(kakukktojás), bash) feladatai:

  1. Korábban kiadott parancsok visszahozása, editálása.(sh nem tudja, bash shell esetén DOSKEY-szerû lehetõségek)
  2. A parancs szavakra bontása.
  3. A ' és " jelek értelmezése.
    " jelek közötti parancsrészben csak a "" jelekkel kezdett további parancsátalakítási feladatok lesznek végrehajtva.
    ' jelek közötti parancsrészben a további parancsátalakítási feladatok nem lesznek végrehajtva.
  4. Az elsõ szó alias(=rövidítések) helyettesítése, function hívások felismerése.
  5. Az input ill. output átirányítása: fájlból, másik parancsból ill. fájlba, fájl végére, másik parancsnak.
    Standard input, standard output, standard error, szûrõk, a pipe fogalma.
  6. Kapcsos zárójelezés kifejtése. alma{fa,moly,csutka} = almafa almamoly almacsutka (sh nem tudja)
  7. Szó elején levõ tilde ( ~, ~csa/xyz, de nem /public/~csa) helyettesítése a(z aktuális) user $HOME directoryjának nevével.(sh nem tudja)
  8. "" Környezetváltozók (pl. $HOME=home directory, $PS1=elsõdleges prompt, $PATH=parancs-/program-keresési útvonal) behelyettesítése.
  9. "" Parancs a parancsban(`parancs` vagy $(parancs) (sh nem tudja) alakú parancs-rész) standard outputjának a parancsba helyettesítése.
  10. "" Aritmetikai kifejezések kiértékelése. Pl. $[2*2] (csak bash) vagy $((2*2)) (sh nem tudja egyiket sem)
  11. A parancs szavakra bontása.
  12. "Joker"(wildcard) karakter(eke)t tartalmazó szavak helyettesítése "rájuk illõ" fájl vagy directory nevekkel a fájlstruktúra alapján.
    * = akárhány akármi
    ? = egy akármi
    [aeiou] = egy a felsoroltak közül
    [b-z] = "a"-tól különbözõ kisbetû
    [A-Z0-9-] = nagybetû vagy számjegy vagy "-" jel
    [!A-Z0-9-] = nem az elõbb felsorolt jelek
    Relatív és abszolut (/...) fájlnevek.
  13. A kapott parancs végrehajtása (belsõ parancs) vagy végrehajtatása (rel. parancsnév esetén a $PATH alapján).

Pl:cd $HOME# Ugyanaz, mint "cd" vagy "cd ~" : hazatérés
 cd /win95/"Program Files"# Helyköz van a fájlnévben
 cp /etc/passwd .# A /etc/passwd fájlt a munkakönyvtárba (.) másolja
 niscat passwd >passwd# Az elõzõnek felel meg valerie-n
 help | less# Linux infó a bash "belsõ" parancsairól
 help echo | less# Linux infó az "echo" belsõ parancsról
 man echo# Infó a "/bin/echo" programról
 man passwd# Infó a jelszó változtatásról
 man -S 5 passwd# Infó a /etc/passwd fájlról (SEE ALSO passwd(5) alapján)
 ls /etc/inittab /ETC/XXX 1>~/van 2>~/nincs# Standard output és standard error szétválasztása
 alias dir='/bin/ls -l'# DOS parancs szimulálása
 dir `cat $HOME/fontos.file-ok` *.c >$HOME/lista# Dir. lista fájlba
 PATH=$PATH:~/bin# A keresési útvonal bõvítése saját programkönyvtárral
 PS1="\w> "# DOS-szerû prompt-beállítás (csak bash)
 tail +25 textfile | head -24 | cut -c1-80# A 2., képernyõnyi rész a "textfile"-ból
 fgrep procedure *.pas | fgrep proc2 | more# A "procedure...proc2" sor(ok) keresése a *.pas fájlokban
 tar -cvf /tmp/ARCHIV $HOME .# $HOME és a munkadir. archíválása a /tmp/ARCHIV fájlba
 tar -tvf /tmp/ARCHIV | tee /tmp/ARCLIS# Az archívum listázása a /tmp/ARCLIS fájlba és képernyõre
 cd ~/public; zip -9 -r ~/haza *# A valerie publikus directorynk csomagolása a "~/haza.zip" fájlba.
 find / -name "*.dvi" -print 2>/dev/null | more# A gépen hozzáférhetõ ".dvi" fájlok megkeresése
 cut -d: -f5 /etc/passwd | cut -d\  -f2 | \
    sort | uniq -c | sort
# Az adott gép user-einek keresztnevei,
    gyakorisági sorrendben
 echo * | xargs grep -i "alma"# Akármekkora directory fájljaiban kis/nagy "almát" keres.
 rm *.c /* mindet töröltem */# Szanálás "gondos c-programozó" módra

Egy parancs több sorban (sor végén "\", folytatósor, elsõdleges, másodlagos prompt), több parancs egy sorban (köztük ";"). Az xargs parancs.

Sorvége jelzés MS-DOS (CR LF), Unix (LF) és Macintosh (CR) op. rendszerekben. Hexadecimális(CR=^M=0x0d LF=^J=0x0a), oktális(CR=015 LF=012) jelölésmód. Az echo, sed és tr parancsok.
Pl: echo -e "\007"# sípol egyet (-e csak Linuxban)
 tr -d "\012" <textfile# a textfile sorait egyberakja
 tr -d "\015" <dosfile >unixfile# DOS textfájlt Unix textfájllá konvertál
 sed "s/`echo -en '\015'`//" dosfile >unixfile# DOS textfájlt Unix textfájllá konvertál
 sed "s/$/`echo -en '\015'`/" unixfile >dosfile# Unix textfájlt DOS textfájllá konvertál

Egyszerû parancsfájlok. A bc parancs, mint szûrõ.
Pl:echo -e "ibase=16\012${1}\012quit" | bc# a paraméterként adott hexadec. számot dec.-ra konvertálja
 echo "ibase=16
      ${1}
      quit" | bc
# ugyanaz, olvashatóbban (más parancs is írható így, sokszor egy hiányzó bezáró idézõjel ( " ' ` ) ugyanezt "eredményezi", nehezen érthetõ parancsfájl hibaként !)
 echo $((0x$1))# a paraméterként adott hexadec. számot dec.-ra konvertálja
 sed "s/<[^>]*>//g" $1 | more# a param. html-fájl "tartalmát" mutatja (nem mindig jól)
 sort $1 | uniq -c | sort | tail -1# Egy fájl "leggyakoribb" sora az elõfordulási számával

A cd, pwd, ls, cp, cat, head, tail, cut, man, help(bash), more/less(Linux), alias, sort, uniq, fgrep, tar, zip, tee, find parancsok.
A "sort" és "uniq" parancsokra további példákat az alábbi, kidolgozott "gyakorló feladatokban" találnak: IV. XV. XXI. 39.

A Unix fájlrendszer készítõi oldalról nézve. (BSD-Unix "fast filesystem", ill. Linux "ext2" fájlrendszer alapján.)
Egy diszk felépítése
boot szektorboot program(pl. 8 MB-os) cilinder-csoportok
Egy cilinder-csoport (egymás alatti gyûrûk a diszkfelületeken) felépítése
szuperblokkcilinder-csoport blokki-node táblaadatblokkok
A szuperblokk fõbb adatai (cilinder-csoportonként ismételve)
blokkméret (1/2, 1, 2, 4... KB)
fragment méret (1/2, 1/4... blokk)
fájlrendszer méret (blokk)i-node száma
adatblokkok száma
cilinder-csoport felépítését leíró adatok
Egy cilinder-csoport blokk fõbb adatai
használt i-node száma
használt adatblokkok száma
szabad blokkok száma és helye(bittérkép)
szabad i-node-ok száma és helye(bittérkép)
szabad fragmentek száma és helye(bittérkép)
Egy i-node adatai
A fájl tipusa (reg., dir., dev, sym.link, mount, stb.)user, group, rwx bitek
"link"-ek száma
utolsó módosítás,
elérés, i-node mód.
(32bit = Y2038!)
A fájl hossza (byte-okban)
10+1+1+1 adatblokk-cím
Egy directory egy sorának szerkezete
Fájlnév (max. 14-255 jel) Pl: . .. igen.hosszu.nevu.fileA fájl i-node-jának száma
A 10+1+1+1 blokkcím (A csak bináris nullákat tartalmazó blokk címe is bináris nulla, az adatblokk nem lesz letárolva !)
10 adatblokk címeegy indirekt címegy duplán indirekt címegy triplán indirekt cím

Oldja meg a fentiek alapján az alábbi - múlt félévi ZH - feladatot:

Egy Unix (Linux) fájlrendszerben a diszkblokk mérete 1024 byte, 1 diszkblokk címe 4 byte-ot foglal el. Hány adatblokkot foglal el egy 501760 byte méretű fájl? (501760=490x1024) (Adatblokk = az i-node területen kívüli, vagyis az adatterületen levő blokk.) Feltételezzük, hogy a fájl nem tartalmaz 1KB méretű vagy annál nagyobb összefüggő, bináris nullákból álló részt.

Ilyen fájlt gyorsan elõállíthat pl. a
     yes | head -250880 >file501760
paranccsal, figyelembevéve, hogy a paraméter nélküli "yes" végtelen sok 2 jelbõl (y+CR) álló sort "termel".

A kapott fájlon az
     ls -ls file501760
paranccsal ellenõrízheti számítása helyességét.

Igen nagyméretû, sok bináris nullával kezdõdõ fájl létrehozása igen kevés diszk-helyen:
  dd of=nagy_file seek=999999  
# 999999 db, bináris nulla blokkal kezdõdik a fájl.
  alma
  Ctrl+D
  ls -ls nagy_file

  4 -rw-rw-rw- 1 root root 511999493 Oct 27 19:01 nagy_file

Az eredménybõl látszik, hogy 3 adatblokk lett lefoglalva a 3-szoros indirekt címzésnek és egy további az "alma"-nak. (A fájl mérete viszont 511999493 byte, amibõl 999999*512=511999488, ehhez jön még az alma 4 byte-ja és egy sorvége jel.) Az mkdir, rm, rmdir, ln, mv, dd parancsok.

A Unix fájl jogosultságok
Kiegészítõ jogosultságok
setuid bitsetgid bitsticky bit
setuid bit (rwsrwxrwx)
programfájl a fájl jogaival fut (nem a futtató jogaival!)
setgid bit (rwxrwsrwx)
programfájl a fájl csoportjának jogaival fut
sticky bit (rwxrwxrwt)
(program)fájl: a memóriában maraddirectory: új fájl csoportja a dir. csoportja lesz (nem a fájl tulajdonosának csoportja !)
A 3x3 rwx (read, write, execute) jogosultság
tulajdonos (owner)a tulajdonos csoportja (group)mindenki (all)
Fájlra
r: olvasásw: írás (módosítás)x: végrehajtás
Directoryra
r: olvasásw: írás (módosítás)
(új fájl felvétele a directoryba, fájl törlése a directoryból
x: a directory alatti "részfa" elérése
Egyes Unixokban (pl. IBM AIX) acl kezdetû parancsokkal egy-egy fájlra user-enként szabályozhatók a jogosultságok.
A jogosultságok módosítása (chmod), default érték beállítása (umask)
bit
setuid
setgid
sticky
owner r
owner w
owner x
group r
group w
group x
all r
all w
all x
beállítás
igen
nem
nem
igen
igen
igen
igen
nem
igen
nem
nem
igen
binárisan
1
0
0
1
1
1
1
0
1
0
0
1
chmod  (ls -lrwsr-x--x)
4
7
5
1
umask  (pl. a $HOME/.profile fájlba téve)
0
2
6
Mit jelent az  ls -lsi /usr/bin/*grep  parancs outputja ?

i-nodeblokktipus + rwxlinktulaj.csop.byteut. mód. dát.fájlnév
18484 0lrwxrwxrwx 1root root 4Mar 29 1997/usr/bin/egrep -> grep
18483 0lrwxrwxrwx 1root root 4Mar 29 1997/usr/bin/fgrep -> grep
1848264-rwxr-xr-x 1root bin 64161Aug 17 1995/usr/bin/grep
18537 2-rwxr-xr-x 1root bin 1331May 19 1994/usr/bin/zgrep
18442 2-rwxr-xr-x 1root bin 1203Sep 25 1994/usr/bin/zipgrep

Környezetváltozók. (PATH, PS1, PS2, TERM, $?, $$ (=processzNr), $! (last backgr. processzNr, ...). A set, export, env, unset parancsok. A shell ciklus- és elágaztató utasításai (for, while, repeat, case, if, break, continue).
A Unix parancsok status kimenete. A test parancs fontosabb opciói (man test részletek):

-d file
True if file exists and is a directory.
-e file
True if file exists
-f file
True if file exists and is a regular file.
file1 -nt file2
True if file1 is newer (according to modification date) than file2.
string1 = string2
True if the strings are equal.
string1 != string2
True if the strings are not equal.
! expr
True if expr is false.
expr1 -a expr2
True if both expr1 and expr2 are true.
expr1 -o expr2
True if either expr1 or expr2 is true.
arg1 OP arg2
OP is one of -eq, -ne, -lt, -le, -gt, or -ge. (arithmetic binary operators)
A test helyett a [ test-opció ] belsõ parancs is írható. (Fontos, hogy a szögletes zárójeleket helyközök vegyék körül!)

A parancsfájl paraméterek ($#, $0, $1, ..., ${10}, ..., $*). A shift és break parancs.

  1. példa: Az alábbi parancsfájl a standard outputra (képernyõre) írja a kapott paramétereket:
    for i in $*
     do
      echo $i
     done
    Ugyanezt megteszi a következõ is:
    while [ $# != 0 ]
     do
      echo $1
      shift
     done
    Az alábbi változatok mindegyike abbahagyja a listázást, ha "alma" nevû paramétert talál:
    for i in $*
     do
      case $i in
       alma) echo "Ilyen buta paraméterrel nem foglalkozom"
             break;;
          *) echo $i;;
      esac
     done
    
    while [ $# != 0 ]
     do
      if [ $1 = "alma" ]
       then echo "Ilyen buta paraméterrel nem foglalkozom"; break
      fi
      echo $1
      shift
     done

  2. példa: "IGEN_NEM" nevû parancsfájl, IGEN/NEM beolvasására a billentyûzetrõl a KERDES környezetváltozóban adott kérdésre: Eredmény: A VALASZ környezetváltozóban "I" vagy "N".
    VALASZ="X"
    while [ $VALASZ = "X" ]
     do
      echo -n $KERDES" "; read valasz
      case $valasz in
       i*|I*) VALASZ="I";exit 0;;
       n*|N*) VALASZ="N";exit 1;;
           *) echo Valaszoljon IGENnel vagy NEMmel !;;
      esac
     done
    Hívás (pl:)
    • KERDES="Szereti Ön a Unixot ?"
      . IGEN_NEM        # "." azért, hogy a választ is megkapjuk !
      echo $VALASZ
    • KERDES="Szereti Ön a Unixot ?"; export KERDES
      if IGEN_NEM
        then VALASZ="I"
        else VALASZ="N"
      fi
      echo $VALASZ

  3. példa: "DILIS" nevû parancsfájl, a paraméterként adott directorynak a benne szereplõ fájl(vagy aldir.)-nevek hossza szerint növekvõ sorrendben történõ listázására. Ha nem adunk meg paramétert, akkor az aktuális directoryra hajtódik végre a parancs.
    case $# in
     1) cd $1;;
     0) ;;
     *) echo Legfeljebb egy parametere lehet a parancsnak !; exit;;
    esac
    ( for i in *
       do
        echo "`echo $i | wc -c` $i"  # " nélkül elvesznek a vezetõ helyközök !
       done ) | sort >/tmp/xyz
    for i in `cut -c9- /tmp/xyz`  # már csak a nevek kellenek
     do
      if [ -d $i ]                   # ha directory
       then ls -ld $i                # nem kell a directoryk belseje
       else ls -l $i
      fi
     done
    rm /tmp/xyz 
    Kérdés: Mit csinál az alábbi parancs ?
    . DILIS log out 

  4. példa: Az alábbi rekurzív parancsfájl paramétere egy directory. Erre, és a belõle kiinduló struktúra fájljaira és (al)directoryjaira a publikus anyagokra szokásos jogosultságokat állítja be:
    chmod 711 $1
    cd $1
    for i in *
     do
      if [ -d $i ]
       then $0 $i
       else chmod 644 $i
      fi
     done
    Nagy struktúrára idõigényes az ilyen fájlonkénti beállítás. Az alábbi "csúnyább" megoldás elõször az egész struktúrára (rekurzív chmod-dal) 644-es jogokat állít be, aztán a directoryra és az aldirectorykra a "find"-ot használva 711-et. (Ez a megoldás nagyságrenddel - sok fájl, kevés directory esetén nagyságrendekkel - gyorsabb lehet a megelõzõnél.)
    chmod -R 644 $1
    chmod 711 $1
    find $1 -type d -exec chmod 711 {} \;
    Megjegyzés: A "find"-ban a "-exec" utáni utasítás minden, a find által talált fájlra/directoryra végrehajtódik. Mivel itt két utasítás (a "find" és a "-exec" utáni) keveredik, az utóbbinak a végét egy olyan pontosvesszõvel kell jelezni, amit a shell továbbad a "find"-nak. A "-exec" utáni utasítás másik különlegessége az, hogy benne a "find" által talált fájlnévre kapcsos zárójelpárral hivatkozhatunk.

  5. példa: Egy kidolgozott gyakorló feladat egyszerûsített változata.

Az eddig szerepeltek közül sok mindenre példa a következõ parancsfájl, ami "Fenykep" Subject-tel levelet ír mindenkinek, aki a "Progkörnyezet" tárgyra jelentkezett: Az itt kékkel írt levélbe egyedi megszólítások és fényképnevek kerülnek.

  niscat passwd >~/niscat    # a niscat lassú, így csak egyszer kell lefutnia
  # Linuxban a /etc/passwd fájlban van a felhasználónkénti 1 sor.
  # A ~csa/public/jelentkezes/progkor fájlban a "Progkornyezet"-re
  #   jelentkezettek user_id-i vannak felsorolva
  for i in `cat ~/public/jelentkezes/progkor`
   do
    # A köv. grep sor elején álló (^) user_id-hez nevet keres,
    #    ami a niscat sor 5. mezõje (mezõk között ":" áll.)
    NEV=`grep "^$i:" ~/niscat|cut -d: -f5`
    echo "$NEV"          # így látom, hol tart a levélküldés
    # Ha a köv. parancsban az ITTAVEGE "" jelek között állna,
    #    akkor a levélszövegbe nem lenne a $NEV és $i aktuális
    #    értéke behelyettesítve
    # Ha az ITTAVEGE elõtt - jel állna, akkor az ITTAVEGE sor
    #    kezdõdhetne tabulátorjelekkel is, így viszont az
    #    ITTAVEGE szövegnek sor elején kell állnia
  
    mailx -s "Fenykep" $i@valerie.inf.elte.hu <<ITTAVEGE
    Kedves $NEV !
  
    Ha a fenykepe be lett szkennelve, akkor a kovetkezo parancsokkal
    masolhatja a kisebb es nagyobb fenykepet a honlapja melle:
   
       cd ~/public/public_html
       cp /public/h/teacher/csa/public_html/kjpg/$i.jpg kiskep.jpg
       cp /public/h/teacher/csa/public_html/jpg/$i.jpg kep.jpg
       chmod 644 *

    Csizmazia Albert
  ITTAVEGE
    sleep 1               # hogy a mailx gyõzze a munkát
   done

A cmp, wc, diff parancsok.

Reguláris kifejezések. (rugalmas string megadásra)

  *             # akárhány (0,1,2...) megelõzõ jel
  .             # egy akármilyen jel
  .*            # akárhány (0,1,2...) akármilyen jel
  [aeiouAEIOU]  # egy jel a felsoroltak közül (magánhangzó)
  [^a-z]        # egy jel a fel nem soroltak közül (nem kisbetû)
  ^reg_kif      # reg. kifejezés a sor elején
  reg_kif$      # reg. kifejezés a sor végén
  \(reg_kif\)   # kijelölt reg. kif. (\1 \2 ...)
Példák:
  grep "procedure.*proc1"         # korábbi példa egyetlen paranccsal
                                          
  
  sed "s/<[^>]*>//g
       s/<[^>]*$//
       s/^[^<]*>//
       s/&aacute;/á/g
       s/&Aacute;/Á/g
       s/&eacute;/é/g
       s/&Eacute;/É/g
       s/&iacute;/í/g
       s/&Iacute;/Í/g
       s/&oacute;/ó/g
       s/&Oacute;/Ó/g
       s/&uacute;/ú/g
       s/&Uacute;/Ú/g
       s/&ouml;/ö/g
       s/&Ouml;/Ö/g
       s/&uuml;/ü/g
       s/&Uuml;/Ü/g
       s/&otilde;/õ/g
       s/&Otilde;/Õ/g
       s/&ucirc;/û/g
       s/&Ucirc;/Û/g
       s/&amp;/\&/g
       s/&lt;/</g
       s/&gt;/>/g" $1 | more  # a param. html-fájlt mutatja
                                Fontos, hogy a paramétersorok végén ne maradjon helyköz!
                                          
  cat <<ITT_A_VEGE >/tmp/sedparam
  s/<[^>]*>//g
  s/<[^>]*$//
  s/^[^<]*>//
  s/&aacute;/á/g
  s/&Aacute;/Á/g
  s/&eacute;/é/g
  s/&Eacute;/É/g
  s/&iacute;/í/g
  s/&Iacute;/Í/g
  s/&oacute;/ó/g
  s/&Oacute;/Ó/g
  s/&uacute;/ú/g
  s/&Uacute;/Ú/g
  s/&ouml;/ö/g
  s/&Ouml;/Ö/g
  s/&uuml;/ü/g
  s/&Uuml;/Ü/g
  s/&otilde;/õ/g
  s/&Otilde;/Õ/g
  s/&ucirc;/û/g
  s/&Ucirc;/Û/g
  s/&amp;/\&/g
  s/&lt;/</g
  s/&gt;/>/g
  ITT_A_VEGE
  sed -f /tmp/sedparam $1 | more       # Ugyanaz, mint az elõzõ
                                          
  sed "s/\([^ ]*\) \(.*\)/\2 \1/"      # vezetéknév - keresztnév csere

  man test | sed "s/.^H//g" >man.test  # "man" lap editorfájlba, olvashatóan

Az fgrep, grep, egrep parancsok.

Reguláris kifejezések használatára - és más dolgokra is - nagyobb lélegzetû, Linux X-Windows-ban futtatandó kidolgozott gyakorló feladatot is talál.

A lehetséges parancs-indítások:

parancs
Új processz indul. Kell export, kell végrehajtási jog.
. parancs
Új processz nem indul. Nem kell export, kell végrehajtási jog. (a ~/.profile, ~/.bash_login ill. ~/.bash_profile - növekvõ prioritású login fájlok)
sh parancs
(Az sh helyén más shell is állhat) Új processz indul. Kell export, nem kell végrehajtási jog.
exec parancs
Új processz nem indul. Kell export, kell végrehajtási jog. A shell maga befejeződik!

Példa "$HOME/.profile" fájlra:

# backspace
stty erase ^H
#
# prompt
PS1="# "; export PS1
#
# alias-ok
alias l="ls -ls"
alias lc="ls -Ca"
#
# term
TERM=linux; export TERM
#
# default: rwxrwxrwx
umask 000
#
# saját könyvtár
case `echo $PATH|fgrep -c sajatbin` in
  0) PATH=$HOME/sajatbin:$PATH ; export PATH ;;
esac
#
# Képernyõ beállítások
A=`tty`
Display=`basename $A`; export Display
Inverz=`tput rev`
Bold=`tput bold`
Normal=`tput sgr0`
Del=`tput clear`
Home=`tput home`
# Pl: echo $Del$Home${Inverz}inverz${Normal}normál
#
# History beállítás képernyõnként, és mentés
HISTFILE=$HOME/hist/his$Display; export HISTFILE
trap "echo 'exit at '`date`' ---***--- elõtte:' >$HISTFILE;exit" TERM
Shell function-ök definiálása és használata (export -f). Példa: 40. kidolgozott gyakorló feladat) A && és || jelentése:
parancs1 && parancs2=if parancs1; then parancs2; fi
parancs1 || parancs2=if parancs1; then :; else parancs2; fi
Szignál küldés és kezelés Unixban. A ps, kill és trap parancsok.

A ps parancs eredménye: (STAT: R=fut(running), S=vár(sleeping))

  PID TTY STAT  TIME COMMAND

    1  ?  S     0:01 init [3] 
  ...
   79  1  S     0:00 -bash 
   80  2  S     0:00 -bash 
   81  3  S     0:00 -bash 
   83  5  S     0:00 -bash 
   84  6  S     0:00 /sbin/agetty 38400 tty6 linux 
   85  7  S     0:00 /sbin/agetty 38400 tty7 linux 
   86  8  S     0:00 -bash 
  225  8  S     0:00 xinit /root/.xinitrc.w95 
  ...
  855  4  S     0:00 -bash 
  923  3  S     0:00 vi floppy_u.html 
  926  4  R     0:00 ps
A vi "kilövése:
kill 923     # = kill -TERM 923
A tty4-en futó bash "kilövése:
kill -KILL 855     # = kill -9 855 ("kill 855" nem elég)

A trap -l parancs eredménye:

 0) EXIT	 1) SIGHUP	 2) SIGINT	 3) SIGQUIT
 4) SIGILL	 5) SIGTRAP	 6) SIGIOT	 7) SIGBUS
 8) SIGFPE	 9) SIGKILL	10) SIGUSR1	11) SIGSEGV
12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGJUNK(16)	17) SIGCHLD	18) SIGCONT	19) SIGSTOP
20) SIGTSTP	21) SIGTTIN	22) SIGTTOU	23) SIGURG
24) SIGXCPU	25) SIGXFSZ	26) SIGVTALRM	27) SIGPROF
28) SIGWINCH	29) SIGIO	30) SIGPWR	31) SIGJUNK(31)
Pl:
trap "tput bel; echo Ne ütögesd a Ctrl+C-t !" INT
...
trap INT      # eredeti állapot
...
trap "" INT   # letiltja a Ctrl+C-t

trap "echo Ne felejtsd el ...;read" EXIT
A Unix boot-olás. Az init parancs. Linux: ps -x | head -2:
   PID TTY STAT TIME COMMAND
     1  ?  SW   0:02 (init)
A Unix futási szintek (runlevel 0-6). (init 0, init 1, init 6)

A shutdown, init 0 és haltsys parancsok. Mi van a "CtrlAltDel" mögött a Linuxban ?

A /etc/inittab konfig. fájl:

# id:runlevels:action:process
# azonosító:futási szint:mikor/hogyan:parancs
#
# Default runlevel.
id:3:initdefault:

# System initialization (runs when system boots).
si:S:sysinit:/etc/rc.d/rc.S

# Script to run when going single user (runlevel 1).
su:1S:wait:/etc/rc.d/rc.K

# Script to run when going multi user.
rc:23456:wait:/etc/rc.d/rc.M

# What to do at the "Three Finger Salute".
ca::ctrlaltdel:/sbin/shutdown -t5 -rfn now

# Runlevel 0 halts the system.
l0:0:wait:/etc/rc.d/rc.0

# Runlevel 6 reboots the system.
l6:6:wait:/etc/rc.d/rc.6

# What to do when power fails (shutdown to single user).
pf::powerfail:/sbin/shutdown -f +5 "THE POWER IS FAILING"

# If power is back before shutdown, cancel the running shutdown.
pg:0123456:powerokwait:/sbin/shutdown -c "THE POWER IS BACK"

# If power comes back in single user mode, return to multi user mode.
ps:S:powerokwait:/sbin/init 5

# The getties in multi user mode on consoles an serial lines.
#
# NOTE NOTE NOTE adjust this to your getty or you will not be
#                able to login !!
#
# Note: for 'agetty' you use linespeed, line.
# for 'getty_ps' you use line, linespeed and also use 'gettydefs'
c1:1235:respawn:/sbin/agetty 38400 tty1 linux
c2:1235:respawn:/sbin/agetty 38400 tty2 linux
c3:1235:respawn:/sbin/agetty 38400 tty3 linux
c4:1235:respawn:/sbin/agetty 38400 tty4 linux
c5:1235:respawn:/sbin/agetty 38400 tty5 linux
c6:12345:respawn:/sbin/agetty 38400 tty6 linux
# Next 2 lines are new:
c7:1235:respawn:/sbin/agetty 38400 tty7 linux
c8:1235:respawn:/sbin/agetty 38400 tty8 linux

# End of /etc/inittab

A /etc/rc... boot-scriptek. (részletek)

#! /bin/sh
#
# /etc/rc.d/rc.S:  System initialization script.
...
# enable swapping
/sbin/swapon -a
/sbin/swapon /PAFE
...
# mount file systems in fstab (and create an entry for /)
# but not NFS because TCP/IP is not yet configured
/sbin/mount -avt nonfs

# rc.K 	This file is executed by init when it goes into runlevel
#	1, which is the administrative state. It kills all
#	deamons and then puts the system into single user mode.
#	Note that the file systems are kept mounted.
...
# Kill all processes.
echo
echo "Sending all processes the TERM signal."
kill -15 -1
echo -n "Waiting for processes to terminate"
for loop in 0 1 2 3 4 5 6 7 ; do
  sleep 1
  echo -n "."
done
echo
...
echo "Sending all processes the KILL signal."
kill -9 -1

# rc.M  This file is executed by init(8) when the system is being
#       initialized for one of the "multi user" run levels (i.e.
#       levels 1 through 6).  It usually does mounting of file
#       systems et al.
...
# Screen blanks after 15 minutes idle time.
/bin/setterm -blank 15
...
# Ensure basic filesystem permissions sanity.
chmod 755 /
chmod 1777 /tmp /var/tmp
...
# Start the sendmail daemon:
if [ -x /usr/sbin/sendmail ]; then
  echo "Starting sendmail daemon (/usr/sbin/sendmail -bd -q15m)..."
  /usr/sbin/sendmail -bd -q15m
fi
...
# Load a custom screen font if the user has an rc.font script.
if [ -x /etc/rc.d/rc.font ]; then
  . /etc/rc.d/rc.font
fi
...
# Start Web server:
# = /var/lib/apache/sbin/apachectl start
if [ -x /etc/rc.d/rc.httpd ]; then
  . /etc/rc.d/rc.httpd
fi
...
# Load a custom keymap if the user has an rc.keymap script.
if [ -x /etc/rc.d/rc.keymap ]; then
  . /etc/rc.d/rc.keymap
fi
...
# Start the local setup procedure.
if [ -x /etc/rc.d/rc.local ]; then
  . /etc/rc.d/rc.local
fi

lrwxrwxrwx   1 root   root        4 Apr  7  1999 rc.0 -> rc.6
-rwxr-xr-x   1 root   root     2376 May 26  1998 rc.6

# rc.6  This file is executed by init when it goes into runlevel
#       0 (halt) or runlevel 6 (reboot). It kills all processes,
#       unmounts file systems and then either halts or reboots.

# Find out how we were called.
case "$0" in
      *0) message="The system is halted."
          command="halt" ;;
      *6) message="Rebooting."
          command=reboot ;;
       *) echo "$0: call me as \"rc.0\" or \"rc.6\" please!"
          exit 1 ;;
esac

# Kill all processes.
#      killall5 -- send a signal to all processes.
if [ "$1" != "fast" ]; then # shutdown did not already kill all processes
  killall5 -15 
  killall5 -9
fi
...
# Now halt or reboot.
echo "$message"
[ ! -f /etc/fastboot ] && echo "On the next boot fsck will be FORCED."
$command -f
Az awk program(ozási nyelv). (a=Aho, w=Weinberger, k=Kerninghan.)

Parancs forma:
awk awk_program input_fájl(ok)
awk -f awk_programot_tartalmazó_fájl input_fájl(ok)
Egy awk program struktogramja és kódja.

A program 1, 2, 3 részei közül egyet is elég megadni.

 
Kódolási szabályok
 
Néhány további szabály
Változók:
Nincs deklaráció, kezdõértékadás (0 vagy ""), típus (tartalomtól függõen numerikus vagy string).
$1, $2, ... $NF : az aktuális input rekord mezõi.
FS : mezõelválasztó (default: helyköz)
FNR : a feldolgozott rekord sorszáma
Tömbök:
Egydimenziós, asszociatív (stringgel indexelt) tömbök.
De:
i="A"; j="B"; k="C"; x[i, j, k]="alma dio"
    ugyanaz, mint:
x["A B C"]="alma dio"
Értékadás:
a=a+1; a+=1; a++
$3=$1-($2+3*$4)
ezer=10E2
darab["szeptember"]=darab["szeptember"]+1
string3="alma" "dio" "mogyoro"; string3="alma dio mogyoro"
Relációk:
==   !=   <   <=   >   >=
Logikai mûveletek:
&& (és)   || (vagy)   ! (nem)
Kiíratás:
print kifejezések
    Pl.(utolsó szó): print $NF
printf "formátum_és_konstansok_keverten", kifejezések
    (minden kifejezéshez 1 formátum)
    Pl(nl): printf "%6d %s\n", FNR, $0
Formátumok:
%s = string, %d vagy %i = egész szám, %f = szám tizedes ponttal, %e = lebegõpontos szám (stb)
Ha a % és a formátum jel között "-" jel áll, balra illesztés történik.
A % és a formátum jel között hosszmegadás is állhat: pl. %30s, %6d, %9.2f (9 hosszban, 2 tizedesre).
Formázó konstansok:
\n = újsor, \t=tabulátor, \f=form-feed(nyomtatón új lap), stb.
Standard függvények:
sqrt(2) = négyzetgyök
gsub(reg_kifejezés, helyettesítõ_string, string) = string-ben reg.kifejezés elõfordulásait helyettesítõ stringre cseréli
length(string) = string hosszát adja (a szélén levõ helyközökkel együtt)
substr(string, kezdõindex, jelek_száma) = string kezdõindextõl kezdõdõ (adott hosszúságú) részét adja
tolower(string) = string-et kisbetûsre konvertál

"awk" programokra különbözõ nehézségû példákat az alábbi, kidolgozott "gyakorló feladatokban" talál: XXIII. 37. 38. 40.

Egy további példa: Az "env" (vagy "set") parancs awk-val megvalósítva (az ENVIRON - elõredefiniált - tömbre):

    awk 'BEGIN { for (x in ENVIRON) printf "%s=%s\n", x, ENVIRON[x] }'

Egy másik példa, aminek az a külön nehézsége, hogy hogyan lehet egy parancsfájl paramétereit az awk-nak átadni (vigyázat: a $1 scriptparaméter nem keverendõ az awk-beli - az aktuális sor elsõ "mezõ"-jét jelölõ - $1-el !) :
Az alábbi 3 script mindegyike kiirja a 3. paraméterként (vagy a standard inputról) kapott fájl 1. és 2. paraméterként kapott (sorszámú) oszlopait, egymástól egy # jellel elválasztva:

    awk "{ printf \"%s#%s\n\", \$$1, \$$2 }" $3

    cat <<EDDIG >/tmp/awk1
    { printf "%s#%s\n", \$$1, \$$2 }
    EDDIG
    awk -f /tmp/awk1 $3

    p1=$1; export p1
    p2=$2; export p2
    awk '{ printf "%s#%s\n", $ENVIRON["p1"], $ENVIRON["p2"] }' $3

Megjegyzések:

  1. Ha a fenti parancsfájlok valamelyikének OSZLOPOK a neve, akkor pl. a
    niscat passwd | sed "s/:/ /g" | OSZLOPOK 1 5
    parancs a valerie userek azonosítóját és nevét listázza.
     
  2. Konkrétan ugyanezt awk-val egyszerûbben így érhetnénk el:
    niscat passwd | awk 'BEGIN {FS=":"} { printf "%s#%s\n", $1, $5 }'
    Mivel ebben az esetben nem akarjuk, hogy a shell helyettesítéseket végezzen az awk programban, sima aposztróf(') jelek közé írtuk azt. (Az utóbbi sor példa awk-beli BEGIN használatára is.)

További részleteket - mint mindig - a man paranccsal (Linuxban man gawk) tudhat meg. A unix mount-olás. A /etc/fstab (vagy máshol /etc/vfstab) fájl. Pl:

device   mount_point  type   mount_options dump? fsck? (1=yes)

/dev/hda2    /        ext2        defaults   1     1
/dev/hdb2    /u       sysv        defaults   1     1
/dev/hdb4    /u2      ext2        defaults   1     1
/dev/hdb1    /j       ext2        defaults   1     1
/dev/hda3    /dosc    msdos       defaults   1     1
/dev/hdb3    /dosd    vfat        defaults   1     1
/dev/hda1    /w95     vfat        defaults   1     1
none         /proc    proc        defaults   1     1

A /etc/mtab fájl az alábbi "mount"-olások után:
    mount -t vfat /dev/hdc4 /zip       # ZIP drive
    mount -t msdos /dev/fd0 /mnt       # DOS floppy
    more /etc/mtab

/dev/hda2 / ext2 rw 1 1
/dev/hdb2 /u sysv rw 1 1
/dev/hdb4 /u2 ext2 rw 1 1
/dev/hdb1 /j ext2 rw 1 1
/dev/hda3 /dosc msdos rw 1 1
/dev/hdb3 /dosd vfat rw 1 1
/dev/hda1 /w95 vfat rw 1 1
none /proc proc rw 1 1
/dev/hdc4 /zip vfat rw 0 0
/dev/fd0 /mnt msdos rw 0 0

A df parancs eredménye (fájlrendszer infó):

Filesystem      1024-blocks  Used Available Capacity Mounted on

/dev/hda2          546401  477596    40581     92%   /
/dev/hdb2          354745  339972    14773     96%   /u
/dev/hdb4          446453  349570    73825     83%   /u2
/dev/hdb1          321516  287286    17624     94%   /j
/dev/hda3          320368  318800     1568    100%   /dosc
/dev/hdb3          515288  511160     4128     99%   /dosd
/dev/hda1          451344  444432     6912     98%   /w95
/dev/hdc4           98078   70878    27200     72%   /zip
/dev/fd0             1423     531      892     37%   /mnt

A more /proc/filesystems Linux parancs eredménye (a Linux által "ismert" fájlrendszerek):

	ext2
	minix
	msdos
	vfat
nodev	proc
nodev	nfs
	iso9660
	xenix
	sysv
	coherent

minix fájlrendszer létrehozása floppyn:
    mkfs -t minix /dev/fd0H1440 1440

A minix fájlrendszer fel-mountolása "readonly" módon, majd ezt követõ mount eredménye:
    mount -r /dev/fd0 /mnt
    mount

/dev/hda2 on / type ext2 (rw)
/dev/hdb2 on /u type sysv (rw)
/dev/hdb4 on /u2 type ext2 (rw)
/dev/hdb1 on /j type ext2 (rw)
/dev/hda3 on /dosc type msdos (rw)
/dev/hdb3 on /dosd type vfat (rw)
/dev/hda1 on /w95 type vfat (rw)
none on /proc type proc (rw)
/dev/fd0 on /mnt type minix (ro)
Rendszeresen futtatandó feladatok:

A crontab parancs.
    -rws--x--x 1 root bin 9236 May 23 1996 /usr/bin/crontab

A cron daemon és a crontab táblázat (user-enként). (pl. /var/spool/cron/crontabs/csa)

#perc óra nap hónap hét_napja parancs
0,10,20,30,40,50 * * * * /usr/lib/atrun >/dev/null 2>&1 # 10 percenként
0 0 1 * mon-fri /home/lajos/ment # munkanapokon és minden 1-én, éjfélkor
0 23-7/2,12 * * * /home/lajos/p1 # 23-tól reggel 7-ig 2 óránként és délben
* * * * * touch $HOME/na_latod_fut_a_cron # teszt
A crontab lehetõségei (csa user számára):
crontab ~/sajat_tab    # = cp ~/sajat_tab /var/spool/cron/crontabs/csa
crontab -l >~/sajat_tab# = cp /var/spool/cron/crontabs/csa ~/sajat_tab
crontab -r  # = rm /var/spool/cron/crontabs/csa
crontab -e  # = vi /var/spool/cron/crontabs/csa (nem minden Unix-ban!)
További parancsok:

umount /dev/fd0
lemountolás
umount /mnt
Ugyanaz, mint az elõzõ
comm f1 f2
3-oszlopos lista: csk f1-ben, csak f2-ben ill. mindkettõben meglevõ fájlokról. (f1 és f2 legyen rendezett)
du
Directory blokkjainak száma
who am I
Ki jelentkezett be a terminálon
who
Ki dolgozik éppen a gépen
last
Ki dolgozik ill. dolgozott a gépen
lastlog
Ki dolgozott már a gépen
finger
Ki dolgozik éppen a gépen
finger -l userid
User info
uuencode/uudecode
(Bináris) fájl át-/vissza-kódolása ASCII formába
hostname
A gép neve
tty
A terminál (device)neve
expr 2 \* 2
4 (aritmetika)
touch *.c
File dátum frissítes (file létrehozás, ha nem volt)
basename /usr/doc/faq/howto/README.gz
README.gz
dirname /usr/doc/faq/howto/README.gz
/usr/doc/faq/howto
stty erase ^H
terminál (backspace) beállítás
fsck
Diszk (fájlrendszer) ellenõrzés
mkuser ...
Userid létrehozás
adduser ...
Userid létrehozás (Linux)
at 2400 -m -f parancsfile
Köv. éjfélkor indítja a parancsfájlt, az eredményrõl "mail"-t kapunk. (Fájlok: /etc/at.allow, /etc/at.deny)
compress, gzip, pack
Fájl tömörítés.
nohup parancs
A "parancs" kijelentkezés után (background) tovább fut
nice parancs
A "parancs" csökkentett priorítással fut
ulimit ...
"ulimit -a" megmutatja a felhasználó rendelkezésére álló rendszer erõforrások korlátait. (Pl. html cgi user részére korlátozva az erõforrásokat, védhetjük a rendszerünket olyan rosszindulatú "kimerítés" ellen, ami óriási html csomagok ráküldésével állhatna elõ.)
Néhány további téma röviden.

Néhány eddig nem vagy alig érintett Unix ismeretre utalok röviden az alábbiakban. Ez legfeljebb arra elég, hogy tudják, minek kell bizonyos problémák, feladatok esetén részletesebben utánanézni.

  • A sed néhány további lehetõsége. ("d" parancs, címek, címtartományok kijelõlése, "cimke" és "goto".)
    ("sed" használatára példákat az alábbi, kidolgozott "gyakorló feladatokban" találnak:
    37. 39. 40.)
  • A set parancs az összes környezetváltozót listázza. Különbözõ opciókkal egész mást csinál. Néhány fontosabb ezek közül: A "set -e" parancsot követõen az elsõ hibás (nem 0 státuszkimenetû) parancs után a shell befejezi a munkát. (Igy "nem hibatûrõ" parancsfájlok kezdõdjenek.) A "set -o vi" parancs (bash esetén felesleges!) azt eredményezi, hogy a "visszahozott" korábbi parancssorok a "vi" soreditálási szabályai szerint módosíthatók. Ha a "set" parancs argumentumokat (nem - jellel kezdõdõ paramétereket) kap, azok a "set"-et követõen a pozícionális paraméterek ($1, $2, ...) helyébe lépnek.
  • Az apropos parancs megmondja egy stringrõl, hogy melyik "man" lapok NAME részében fordul elõ.
  • A terminfo (régebben termcap) egy olyan "képernyõ adatbázis", amiben rengeteg termináltipusra megadják, hogy milyen jelsorozatokat kell küldeni a terminálra bizonyos hatások (pl. pozícionálás, törlés, szín vagy fényesség) beállítására. Ugyanitt adható meg pl. az is, hogy milyen billentyûkombináció jelenti az F1, F2, ... funkcióbillentyûket.
    A termcap csak "source" formában létezik, a terminfo-hoz is tartozik olvasható "source", de azt a "tic" paranccsal le kell fordítani. A fordításnak a (többnyire a /usr/lib/terminfo aldirectoryjaiban tárolt). eredményét használják a Unix alatt futó programok. A terminfo ill. termcap "source" fájlok megértése és készítése fáradságos, idõigényes feladat. (A termcap "source" a captoinfo paranccsal alakítható át terminfo "source" formába.)
  • A tput paranccsal tudunk shell szinten "képernyõfüggetlenül" írni képernyõvezérlõ parancsokat. Ezekben a terminál-hatás "terminfo"-s nevét adjuk meg paraméterül, eredményül pedig a hatást kiváltó, terminálfüggõ jelsorozatot kapjuk. Ehhez a terminál tipusát a TERM környezetváltozóban be kell állítani, amit maga a Unix rendszer - többnyire jöl - megtesz. A lehetõségek rugalmassága azzal is növelhetõ, hogy a /usr/lib/terminfo helyett más adatbázist is használhatunk, ha a saját terminfo directory nevét betesszük az exportált TERMINFO nevú környezetváltozóba.
    Néhány példa a tput használatára:
          tput clear             # törli a képernyõt
          tput bold              # fényesebb betûket ír
          tput rev               # inverzbe megy át
          tput blink             # villogó betûket ír
          tput setb n            # háttérszín legyen "n" (n=0,1,2,3,4,5,6,7; csak Linux)
          tput setf n            # betûszín legyen "n" (n=0,1,2,3,4,5,6,7; csak Linux)
          tput sgr0              # újra normál betûket és színeket ír
          tput bel               # sípoló hangot ad
          tput cup 12 40         # a 12. sor 40. oszlopára pozícionál
          tput reset             # esetleg visszaállítható vele az "elrontott képernyõ"
          
  • A billentyûzet átkonfigurálására Unixonként egészen más fájlokba kell belenyúlni, az ezt aktívizáló parancsok sem egységesek. A "telnet" maga is "belejátszik" abba, hogy mit kap a Unix egy billentyû leütése után. Linuxhoz a linux.tty, SCO-Unixhoz a sco.tty letölthetõ fájlok segíthetnek annak, aki erre a fáradságos munkára kényszerül.
  • Ugyanennyire nem egységes a belsõ kódokat a képernyõn megjelenítõ fontkészlet kiválasztása sem. Linuxban a setfont parancs szolgál erre a célra. (Paraméter nélkül használva arra is jó lehet, hogy a "grafikus módba átment" terminált visszaállítsuk karakteres módba.)
  • Minden Unix tartalmaz legalább néhány olyan parancsot, amivel DOS floppy-ra alapvetõ feladatokat végre lehet hajtani. A Linuxban legalább az mcopy és mdir parancsokat (a lovardában pl.) célszerû ismerni. (Van hozzájuk "man", de azt ismerve, hogy "m" betû nélküli DOS megfelelõjük mire való, "man" nélkül is kitalálható a használatuk.) Az összes többi Unixban doscp ill. dosdir felel meg az elõbbi két parancsnak, és doscat, dosls, dosmkdir, dosrmdir, dosformat szokott lenni a további teljes választék.(A parancsok nagyjából azt tudják, amit a "dos" elõtag nélküli Unix ill. DOS megfelelõjük.)

Csizmazia Albert csa@valerie.inf.elte.hu