A fizikai fájlokhoz és directorykhoz (amik speciális fájlok) ún. inode-számokat rendel a Unix. A felhasználó által használt nevek mindegyikéhez egy "név, inode-szám" alakú directory bejegyzés tartozik. Ezért tud ugyanaz a fájl több néven - akár különböző directorykban - is előfordulni. A "symbolic link" (szimbolikus link) olyan speciális fájl, ami egy (rajta keresztül is elérhető) fájl vagy directory nevét tartalmazza. A több néven történő elérésre - egyebek mellett - az alábbi példák szerepelnek az ábrán:
Egy fájlrendszeren belül az inode számok egyediek. Használni több fájlrendszert úgy lehet, hogy az ún. gyökér fájlrendszerre (a mount paranccsal) "felakaszthatunk" másik fájlrendszereket. Az ábrán ezeket az inode szám elé tett csillaggal jelöltem. Különböző fájlrendszerhez tartozó dolgok között csak "laza összenövés", azaz sym.link fordulhat elő.
A Unix többfelhasználós, több processzt "párhuzamosan" futtató op. rendszer, esetenként egyedi, többnyire (i)x-re végződő névvel. (SCO-Unix, Sinix, AIX, Xenix, Unixware, Linux, Solaris).
Shell = parancs értelmező program. Tkp. programozási nyelv, változókkal ("környezetváltozók"), utasításokkal ("parancsok").
| Pl: | cd $HOME | # Ugyanaz, mint "cd" vagy "cd ~" : hazatérés |
| cd /win95/"Program Files" | # Helyköz van a fájlnévben (kerüljük!!!) | |
| cp /etc/passwd . | # A /etc/passwd fájlt a munkakönyvtárba (.) másolja | |
| man echo | # Infó a "/bin/echo" programról | |
| man passwd | # Infó a jelszó változtatásról | |
| man kpasswd | # Infó a jelszó változtatásról - régi pandora | |
| man -S 5 passwd | # Infó a /etc/passwd fájlról (SEE ALSO passwd(5) alapján) | |
| PS1="\w> " | # DOS-szerű prompt-beállítás (csak bash shell) | |
| # Szanálás "gondos c-programozó" módra |
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. $$ környezetváltozó (processzNr).
Daemon-ok (=háttérben futó kiszolgáló programok, pl. httpd) feladatai.
Foreground, background parancs végrehajtás.
Editorok: vi (segédanyagok), emacs, pico, joe, wpe, mc editora.
A shell (sh, ksh, csh(kakukktojás), bash) feladatai:
| 4. | alias dir='/bin/ls -l' | # alias definiálása |
| dir *.c >~/lista | # és használata (dir. lista fájlba) | |
| 5. | help | less | # pipe: Linux infó a bash "belső" parancsairól |
| help variables | less | # Néhány fontosabb környezetváltozó | |
| tail +25 t1 | head -24 | cut -c1-80 | # A 2., képernyőnyi rész a t1 "textfile"-ból | |
| fgrep -i A *.txt|fgrep -i B|more | # Olyan sorok a .txt fájlokból, amikben "a" és "b" betű is van | |
| ls /etc/inittab /ect/x 1>van 2>nincs | # Standard output és standard error szétválasztása | |
| find / -name "*.dvi" -print | more | # A gépen található ".dvi" fájlok megkeresése | |
| echo valami nem stimmel 1>&2 | # St. output átirányítása a "st. error"-ra | |
| 5,9 | ls `cat f1` 2>&1 1>/dev/null|tee f2 | # f1-ben felsorolt, nemlétezők: képernyőre + f2 fájlba (2>,1> sorrendje!) |
| 9. | Userek=`cut -d: -f1 /etc/passwd` | # Környezetváltozóban az összes user_id |
| 7,9. | echo ~maulis | # Eredmény: /h/m/maulis (pandora-n) |
| 8,9. | KV=HOME;echo ${$KV} | # Eredmény: hibás a parancs! |
| KV=HOME;echo \${$KV} | # Eredmény: $HOME (8. csak egyszer!) | |
| KV=HOME;echo $`echo $KV` | # Eredmény: $HOME (8. és 9. sorrendje!) | |
| # Eredmény: /h/teacher/csa (pandora-n, csa-nak) | ||
| KV=HOME;echo echo $`echo $KV`|sh | # Eredmény: /h/teacher/csa (pandora-n, csa-nak) | |
| KV=HOME;echo ${!KV} | # Ez is jó; nem régóta tudja a bash | |
| 8,10. | KV=HOME;echo ${KV:$((${#KV}-2)):2} | # Eredmény: $KV utolsó két jele |
| 3,12. | rm -r d1 2>/dev/null | # Törlés, hibaüzenet nélkül (folyt. köv.) |
| mkdir d1; cd d1 | # Directory kreálás és váltás | |
| echo 1234 >f1; grep [1-9] * | # Eredmény: "1234" | |
| echo abcd >9; grep [1-9] * | # Eredmény: "" | |
| grep "[1-9]" * | # Eredmény: "f1:1234" | |
| echo grep [1-9] * | # Eredmény: "grep 9 9 f1" | |
| echo grep "[1-9]" * | # Eredmény: "grep [1-9] 9 f1" | |
| 12. | ls /e?c/i*tab | # Eredmény: /etc/inittab |
| dd if=/e?c/i*tab | # Eredmény: "dd: /e?c/i*tab: No such file or directory" | |
| rm $NINCSILYEN/* | # Csak a directoryk és rejtett fájlok (. a név elején) maradnak meg |
Több parancs egy sorban (köztük ";"). Egy parancs több sorban (sor végén "\", folytatósor, elsődleges, másodlagos prompt). A tee parancs. Az xargs parancs.
| Pl: | cd ~/public; zip -9 -r ~/p * | # Publikus directory (pandora) csomagolása a "~/p.zip" fájlba. |
tr " " "\012" | sort|uniq -c|sort | # Az adott gép user-einek keresztnevei, gyakorisági sorrendben (\012 = sorvégejel) | |
| tar -cvf /tmp/archiv $HOME . | # HOME és munkadir. összecsomagolá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 | |
| echo * | xargs grep -i "alma" | # Akármekkora directory fájljaiban kis/nagy "almát" keres. |
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), "backslash"(CR=\r, LF=\n) jelölésmód (újabban). Az echo, sed és tr parancsok.
| Pl: | echo -e "\007" | # sípol egyet (-e csak Linuxban) |
| tr -d "\012" <textfile | # a textfile sorait egyberakja (kell a "<" jel! | |
| 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/\r//" dosfile >unixfile | # ugyanaz, mint az előző, a legújabb sed-del | |
| # Unix textfájlt DOS textfájllá konvertál | ||
| sed "s/$/\r/" unixfile >dosfile | # ugyanaz, mint az előző, a legújabb sed-del |
Megjegyzések:
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ál:
IV.
XV.
XXI.
39.
A Unix fájl jogosultságok
Minden fájl/directory egyetlen tulajdonoshoz és csoporthoz tartozik.
|
| ||||||||||||||||||||||||||||||||||||
|
Linux ext2/ext3: további 8-14 jogosultság kezelhető a chattr (root, vagy setuid), listázható az lsattr paranccsal.
Ezekkel egy fájl pl. módosíthatatlanná, törölhetetlenné tehető még a root számára is, a "hagyományos" jogoktól függetlenül. "Alakul" a dolog. (A pandora-n pl. - 2004 elején - 9 jogról szól a man chattr, de 14-et listáz az lsattr.) | |||||||||||||||||||||||||||||||||||||
| 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 | ||||||||||||
| beállítás | ||||||||||||
| binárisan | ||||||||||||
| chmod (ls -l: rwsr-x--x) | ||||||||||||
| umask (pl. a $HOME/.profile fájlba téve) | ||||||||||||
A Unix fájlrendszer készítői oldalról nézve. (BSD-Unix "fast filesystem", ill. Linux "ext2" fájlrendszer alapján.)
| boot szektor | boot program | (pl. 8 MB-os) cilinder-csoportok | |
| szuperblokk | cilinder-csoport blokk | i-node tábla | adatblokkok |
| 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 |
| 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) | |
| 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 |
| Fájlnév (max. 14-255 jel) Pl: . .. igen.hosszu.nevu.file | A fájl i-node-jának száma | ||
| 10 adatblokk címe | egy indirekt cím | egy duplán indirekt cím | egy triplán indirekt cím |
Oldja meg a fentiek alapján az alábbi - korábbi félévbeli ZH - feladatot:
Ilyen fájlt Linuxban 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".
Az alábbi paranccsal ellenőrízheti a számítás helyességét:
ls -ls file501760
Módosítás közben történt crash (áramkimaradás, stb.) esetén az eredeti fájlból és a journal-ból vissza tudja állítani a rendszer az eredeti vagy a részben megváltozott fájlt. Ez feleslegessé teszi bootolás közben a teljes fájlrendszerre történő konzisztencia vizsgálatot (fsck), ami a mai soktíz vagy többszáz gigabájtos fájlrendszerekre már túlságosan időigényes.
A "journaled" fájlrendszerben nem pontosan az előzőkben leírtak szerint lesz tárolva a fájl. Azon kívül, hogy nem annyira szétszórtan tárolják a fájlt, egyéb (Unixonként más-más) optimalizálásokat is végeznek. Ez jelenti egyes esetekben azt, hogy az adatbáziskezelésben használt formában ("B fákban") tárolják a fájlrendszert, ami - röviden mondva - egy bonyolult, de effektív tartalomjegyzék-tartalom összerendelést tesz lehetővé. Apró optimalizálás pl. az IBM AIX-ben, hogy a kis directoryk tartalma az i-node-ba kerül.
A Red Hat 7.1 és a SuSE 7.0. Linux verziókban "ReiserFS" a fájlrendszer neve (Hans Reiser-ről elnevezve).
Igen nagyméretű, sok bináris nullával kezdődő fájl létrehozása igen kevés diszk-helyen:
4 -rw-rw-rw- 1 root root 511999493 Oct 27 19:01 nagy_file
dd of=nagy_file seek=999999
# 999999 db, bináris nulla blokkal kezdődik a fájl.
alma
Ctrl+D
ls -ls 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.
Hajtsuk végre az alábbi parancs sorozatot:
rm -r dir1 2>/dev/null
mkdir dir1
cd dir1
echo "alma dio mogyoro" >f1
chmod 666 f1
ln f1 f1.h
chmod 600 f1.h
sleep 60
ln -s f1 f1.s
chmod 664 f1.s
ls -li
Miért a következő eredményt kapjuk (sikeres) végrehajtás után ?
| inode szám | tipus + rwx | link | tulaj. | csop. | byte | ut. mód. dát. | fájlnév |
|---|---|---|---|---|---|---|---|
| 101173 | -rw-rw-r-- | 2 | csa | users | 17 | Oct 29 15:25 | f1 |
| 101173 | -rw-rw-r-- | 2 | csa | users | 17 | Oct 29 15:25 | f1.h |
| 101174 | lrwxrwxrwx | 1 | csa | users | 2 | Oct 29 15:26 | f1.s -> f1 |
Mit jelent az ls -lsi /usr/bin/*grep parancs outputja ?
| i-node | blokk | tipus + rwx | link | tulaj. | csop. | byte | ut. mód. dát. | fájlnév |
|---|---|---|---|---|---|---|---|---|
| 18484 | 0 | lrwxrwxrwx | 1 | root | root | 4 | Mar 29 1997 | /usr/bin/egrep -> grep |
| 18483 | 0 | lrwxrwxrwx | 1 | root | root | 4 | Mar 29 1997 | /usr/bin/fgrep -> grep |
| 18482 | 64 | -rwxr-xr-x | 1 | root | bin | 64161 | Aug 17 1995 | /usr/bin/grep |
| 18537 | 2 | -rwxr-xr-x | 1 | root | bin | 1331 | May 19 1994 | /usr/bin/zgrep |
| 18442 | 2 | -rwxr-xr-x | 1 | root | bin | 1203 | Sep 25 1994 | /usr/bin/zipgrep |
A parancsfájl paraméterek ($#, $0, $1, ..., ${10}, ..., $*, $@). A shift parancs.
Aritmetika, a bc parancs (szűrő!).
| Pl: | expr 2 \* 2 | # 4 |
| a=2; expr $a \* $a | # 4 | |
| # 4 (régi shellben nincs "let") | ||
| a=2; b=a+1; echo $b | # Eredmény: "a+1" (string!) | |
| a=$((a+1)) | # Ez is jó | |
| echo "ibase=16 ABCD" | bc | # Eredmény: 43981 (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 $((0xABCD)) | # Ez is "hexadec ---> dec" konverzió | |
| echo $((16#ABCD)) | # Meg ez is (más alappal is megy) |
Egyszerű parancsfájlok.
| echo $((0x$1)) | # a paraméterként adott hexadec. számot dec.-ra konvertálja | |
| echo "ibase=16 ${1}" | bc | # hexadec --> dec. konvertáló parancsfájl | |
| 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 lehetséges parancs-indítások:
Példa "$HOME/.profile" fájlra (minden Unixban lehet használni):
stty erase ^H # backspace
PS1="# "; export PS1 # prompt
export PATH=$HOME/sajatbin:$PATH # saját könyvtár
alias l="ls -ls"; alias lc="ls -Ca" # alias-ok
export TERM=linux # TERMinál beállítás
umask 000 # default: rwxrwxrwx
#
# Képernyő beállítások
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ások, (részben) karakteres módra:
export HISTFILESIZE=10000; export HISTSIZE=1000
export HISTCONTROL=akarmi; shopt -s histappend
A=`tty`; export HISTFILE=$HOME/hist/his`basename $A`
trap "echo 'exit at '`date`' ---***--- előtte:' >>$HISTFILE;exit" TERM |
A Unix parancsok státusz kimenete (visszatérési értéke; exit status). (0-255; 0="true")
$? környezetváltozó: utolsó parancs státusz kimenete
A test parancs fontosabb opciói (man test részletek):
Nincs mindenütt "string1 > string2" lehetőség (Többnyire output elirányítása jön létre helyette, nincs ">=" és "<=" sem! De vannak Unixok, ahol "\<" "\>", ... megy stringekre.)
string1 == string2 : régi shell-ben csak az "=" megy.
A shell ciklus- és elágaztató utasításai (for, while, repeat, case, if, break, continue). (Az alábbi help outputban a [] elhagyható parancsrészt jelöl!)
if c1; then c2; [ elif c3; then c4; ]... [ else c5; ] fi
for Name [in Words ... ;] do Commands; done # Name: környezetváltozó
for ((expr1; expr2; expr3)); do Commands; done # A legújabb bash tudja
case Word in [Pattern [| Pattern]...) Commands ;;]... esac
while Commands; do Commands; done
for i in $* do echo $i doneUgyanezt megteszi a következő is:
while [ $# != 0 ] do echo $1 shift doneAz 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
Megjegyzések:
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:)Ami új benne:
| parancs1 && parancs2 | = | if parancs1; then parancs2; fi |
| parancs1 || parancs2 | = | if parancs1; then :; else parancs2; fi |
case $# in
1) cd $1 2>/dev/null || { echo Nem sikerült a \"cd $1\" >&2; exit 1; };;
0) ;;
*) echo Legfeljebb egy parametere lehet a parancsnak ! >&2; exit 1;;
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 belseje
else ls -l $i # (Ehelyett a 4 sor helyett
fi # "ls -ld $i" is elég lenne)
done
rm /tmp/xyz
A kék sorok helyett ezt is írhatjuk:echo `echo $i | wc -c` $i done ) | sort -n >/tmp/xyz for i in `cut -d" " -f2 /tmp/xyz`Kérdés: Mit csinál az alábbi parancs ?
. DILIS log out
chmod 711 "$1" cd "$1" for i in * do if [ -d "$i" ] then $0 "$i" else chmod 644 "$i" fi doneMegjegyzés: A rekurzió ($0) nem működik, ha relatív névvel hívjuk, mert a "cd" elállítja a munkadirectoryt. Megoldás (Linux):
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.
(A script gyors, de a pandora-n és egyes Linuxokon nem működik, mert azok komolyan veszik, hogy letiltottuk az aldirectorykra a belépési jogunkat.)
chmod -R 711 $1
find $1 -type f -exec chmod 644 {} \;
(Ez is elég gyors, és mindenütt is működik.)
A cmp, wc, diff parancsok. A diff igen fontos a nagy projektek (program, könyv) "verzió kezelés"-ében.
A "for ((expr1; expr2; expr3)); do Commands; done" bash szerkezet ekvivalens az alábbival.
((expr1))
while ((expr2))
do
Commands
((expr3))
done
expr kiértékelés:
for ((i=100;i<1000;i++)); do echo $i; done
i=100; for ((;i<1000;)); do echo $i; let i++; done # mutatja, mi hova való
i=100; for ((;i<1000;)); do echo $i; ((i++)); done # és hogyan lehet még írni
for i in `seq 100 999`; do echo $i; done # csak Linuxban van "seq"
echo {1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9} | tr " " "\012"
for ((i=1,j=$#;i<=$#;ii=i++,jj=--j))
do
echo -n i=$i j=$j ii=$ii jj=$jj" "
eval echo \$$j # "echo $$j" vagy "echo ${$j}" nem megy!
# legújabb bash-ban: "echo ${!j}" megy!
done
Ha ezt meghívjuk "alma dio mogyoro" paraméterekkel, akkor az eredmény:
i=1 j=3 ii= jj= mogyoro i=2 j=2 ii=1 jj=2 dio i=3 j=1 ii=2 jj=1 alma
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 (angol ABC 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. (hivatkozás: \1 \2 ...)
Kiterjesztett reg. kif (csak egrep):
+ # akárhány (1,2...) megelőző jel
.+ # akárhány (1,2...) akármilyen jel
? # 0 vagy 1 megelőző jel
\{n\} # pontosan "n" db megelőző jel
\{m,n\} # min. "m", max. "n" db megelőző jel
reg_k1|reg_k2 # "reg_k1" vagy "reg_k2" valamelyike előfordul
(reg_kif) # csoportosítás (pl. "(bla)\{2,\}" = legalább "blabla")
Példák:
grep "procedure.*proc1" # korábbi példa egyetlen paranccsal
sed "s/<[^>]*>//g
s/<[^>]*$//
s/^[^<]*>//
s/á/á/g
s/é/é/g
s/í/í/g
s/ó/ó/g
s/ú/ú/g
s/Á/Á/g
...
s/ö/ö/g
s/Ö/Ö/g
s/ü/ü/g
s/Ü/Ü/g
s/õ/ő/g
s/Õ/Ő/g
s/û/ű/g
s/Û/Ű/g
s/&/\&/g
s/ / /g
s/</</g
s/>/>/g" $1 | more # a param. html-fájlt mutatja
# a paramétersorok végén ne maradjon helyköz!
cat <<ITT_A_VEGE >/tmp/sedparam
s/<[^>]*>//g
s/<[^>]*$//
...
s/>/>/g
ITT_A_VEGE
sed -f /tmp/sedparam $1 | less # Ugyanaz, mint az előző
grep "^\([^ ]\).\1" eloadas.htm # Sorok, amikre: 1.jel = 3. jel != helykö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.
Az eddig szerepeltek közül sok mindenre példa a következő parancsfájl, ami "Progkor" Subject-tel levelet ír a pandora gépen mindenkinek, aki a "Progkör" tárgyra jelentkezett: Az itt kékkel írt levélbe egyedi megszólítások és honlapcímek kerülnek.
jelentkezes --ta=csa --hi=progkor --li | grep "^ *[1-9]" | sed "s/^ *[^ ]* //" | while read
do
# A REPLY változóban "Név (user_id)" alakú sor van.
NEV=`echo "$REPLY" | sed "s/ (.*//"`
Uid=`echo "$REPLY" | sed "s/.*(//" | sed "s/)//"`
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(név) és $Uid(user_id)
# 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 "Progkor" $Uid@inf.elte.hu <<ITTAVEGE
Kedves $NEV !
Jelentkezett a Programozasi Kornyezet targyra.
A targy honlapjai: http://progkor.inf.elte.hu
http://people.inf.elte.hu/csa
Ne feledkezzen meg a kiirt beadando feladatok hataridore torteno
elkesziteserol. ZH-t (maj. 8-an ill. 15-en) csak az irhat (vagyis
a targyat ebben a felevben az vegezheti el), akinek a honlapja es
Unix beadandoi hataridore elkeszulnek ill. be lesznek kuldve.
A honlapjanak apr. 24-ig a pandora-n, az alabbi cimen kell lenni:
http://people.inf.elte.hu/$Uid
Csizmazia Albert
ITTAVEGE
sleep 1 # hogy a mailx győzze a munkát
done
Shell function-ök (export -f). P1, P1A, P2 shell scriptek (az aktuális directoryban):
P1 echo 1. PARAMETER: $1 echo 2. PARAMETER: $2 . ./P1A $1 $2 . ./P1A 12345 9876 |
P2
# a definíció előzze meg a hívást
function P2A ()
# "function" és "()" egyike elég!
{ let local osszeg=$1+$2
# az osszeg csak itt érvényes
echo $1+$2=$osszeg
}
echo 1. PARAMETER: $1
echo 2. PARAMETER: $2
P2A $1 $2
P2A 12345 9876 |
P1A let osszeg=$1+$2 echo $1+$2=$osszeg | |
A
./P1 2005 1
./P2 2005 1
hívások mindegyike azt írja ki (sor elejére), hogy:
1. PARAMETER: 2005
2. PARAMETER: 1
2005+1=2006
12345+9876=22221 | |
Az awk program(ozási nyelv). (a=Aho, w=Weinberger, k=Kerninghan.)
| 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 | |
| |
awk '{print substr($0,FNR,1}' "$@"
Vagy:
awk -F "" '{print $FNR}' "$@"
Vagy:
awk 'BEGIN {FS=""} {print $FNR}' "$@"
Ugyanez, "átlósan" kiírva:
awk '{ for (i=1;i<FNR;i++) printf " "
print substr($0,FNR,1)
}' "$@"
Megoldás awk nélkül (minta, soronkénti feldolgozásra; ld. még help read vagy man read):
i=1
cat "$@" |\
while read
do
j=1
while [ $j -lt $i ]
do
echo -n " "
let j=j+1
done
echo "$REPLY" | cut -c$i
let i=i+1
done
Megjegyzés: A "$@" formájú paraméterhivatkozás (egy szűrőparancsba írva) alkalmas arra, hogy a parancsfájl helyközt tartalmazó
paramétereket is jól kezeljen, és maga is szűrő legyen (vagyis a standard
inputról dolgozzon, ha nem kap paramétert, és a kapott fájlokból, ha kapott paramétert.)
Magyarázza meg (help read), miért nem azonos az alábbi két sor eredménye:
echo " alma dio "|while read; do echo /"$REPLY"/; done
echo " alma dio "|while read sor; do echo /"$sor"/; done
awk 'BEGIN { for (x in ENVIRON) printf "%s=%s\n", x, ENVIRON[x] }'
awk -v o1=$1 -v o2=$2 '{ printf "%s#%s\n", $o1, $o2 }' $3
awk '{ printf "%s#%s\n", $o1, $o2 }' o1=$1 o2=$2 $3
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:
sed "s/:/ /g" /etc/passwd | OSZLOPOK 1 5parancs a Unix userek azonosítóját és vezetéknevét listázza.
awk 'BEGIN {FS=":"} { printf "%s#%s\n", $1, $5 }' /etc/passwd
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.)
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 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) |
A Unix boot-olás.
Az init parancs. Linux: ps -x | head -2:
PID TTY STAT TIME COMMAND
1 ? SW 0:02 (init) |
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 boot-olás során végrehajtott parancsokat részletesen az inittab-ban hivatkozott - többnyire hosszú, bonyolult - scriptekben találjuk. Néhány jellemző részlet (egy Slackware Linux) installációból külön lapon látható.
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 |
Linuxban további crontab directoryk és fájlok:
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.
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ő"
| Csizmazia Albert | csa@inf.elte.hu |