Linux bevezeto˝ (jegyzet) B´erci Norbert, Uhl´ar L´aszl´o 2015. szeptember 24-i ´ora anyaga
Tartalomjegyz´ ek 1. Egy 1.1. 1.2. 1.3.
kis t¨ ort´ enelem A kezdetek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A GNU projekt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1 1 2 2
2. Programok futtat´ asa 2.1. Param´eterek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3 4
3. K¨ onyvt´ arak ´ es el´ er´ esi utak
4
4. Ko altoz´ ok ¨rnyezeti v´ ¨ 4.1. Osszef˝ uz´es . . . . 4.2. PATH . . . . . . 4.3. PS1 . . . . . . . 4.4. LANG . . . . . .
. . . .
6 7 7 8 9
5. F´ ajlok kezel´ ese 5.1. Mintailleszt´es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2. Egy´eb speci´ alis karakterek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9 12 14
´ any´ıt´ 6. Atir´ as
16
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
1. Egy kis to enelem ¨rt´ 1.1. A kezdetek A sz´ am´ıt´ og´epek az ¨ otvenes ´evekt˝ ol a nyolcvanas ´evek elej´eig a kutat´ok eszk¨ozei voltak ´es a t¨ omegek el˝ ol gyakorlatilag el voltak z´ arva. T¨obb kutat´o haszn´alt egy nagy g´epet, a fejleszt´eseiket megosztott´ ak egym´ assal, igazi kis k¨ oz¨oss´egek j¨ottek ´ıgy l´etre. A kor egyik legend´as g´epe volt a PDP10-es, ezen az ITS nev˝ u oper´ aci´os rendszer futott, aminek tov´abbfejleszt´es´en dolgozott Richard Stallman is (l´ asd k´es˝ obb). A PDP10 fejleszt´es´et azonban a gy´art´oja a nyolcvanas ´evekre abbahagyta, az int´ezeteknek u ´jabb g´epek ut´an kellett n´ezni¨ uk. Ezek m´ar m´as oper´aci´os rendszert futtattak, melyek nem voltak szabadok, m´ar ahhoz is titoktart´asi szerz˝od´est kellett al´a´ırniuk, ha egy futtathat´ o m´ asolatot akartak. Azaz tilos lett egym´asnak seg´ıteni, az eddig egy¨ uttm˝ uk¨od˝o k¨ oz¨ oss´egek felbomlottak, nem oszthatt´ak meg egym´assal fejleszt´eseiket. 0 Revision
: 62 Date : 2014 − 09 − 2011 : 32 : 02 + 0200(Sat, 20Sep2014)
1
1.2. A GNU projekt Richard Stallman ezt az u ´j helyzetet nem tudta elfogadni, elhat´arozta egy u ´j, teljesen ny´ılt oper´ aci´ os rendszernek a meg´ır´ as´ at: 1983 t´aj´an l´etrehozta a GNU projektet, hogy terveit megval´ os´ıtsa. (A GNU jelent´ese: GNU is not UNIX). Ekkor fogalmazta meg a GNU ki´altv´anyt (melyet teljes terjedelm´eben p´eld´ aul a http://gnu.hu oldalon olvashatunk el) ´es a szabad szoftverekkel kapcsolatos alapelveit: • a program szabadon haszn´ alhat´ o b´armilyen c´elra, • a programot b´ arki szabadon m´ odos´ıthatja ig´enyei szerint, • a programot b´ arki tov´ abbadhatja ak´ar ingyen ak´ar p´enz´ert, • a program m´ odos´ıtott verzi´ oinak meg kell felelnie ugyanezen felt´eteleknek. Ezen elvek jogilag is megfelel˝ o form´ aba o¨nt´es´enek eredm´enyek´eppen j¨ott l´etre egy k¨ ul¨onleges licenc, a GPL (General Public Licence) (teljes sz¨ovege magyarul szint´en a http://gnu.hu oldalon olvashat´ o) ´es a szabad szoftvereket t´ amogat´o alap´ıtv´any, az FSF (Free Software Foundation) is. Ez ut´ obbi c´elj´ ar´ ol, m˝ uk¨ od´es´er˝ ol r´eszletesebb le´ır´as olvashat´o t¨obbek k¨oz¨ott az fsf.hu oldalon. A GNU projekt keret´eben sz´ amos programot kifejlesztettek, m´ar csak egy valami hi´anyzott: egy olyan kernel (az oper´ aci´ os rendszer magja), melyen futtatni lehetne ezeket.
1.3. A Linux 1991-ben egy finn egyetemista, Linus Torvalds ´epp egy u ´j projekten kezdett el dolgozni: egy u ´j, szabad oper´ aci´ os rendszeren, melyben ki akarta jav´ıtani az oktat´asra akkoriban el˝oszeretettel haszn´ alt MINIX oper´ aci´ os rendszer hib´ait, hi´anyoss´agait. Azaz adott volt egy kernel (Linus munk´ aja) alkalmaz´ asok n´elk¨ ul ´es adott volt egy alkalmaz´as gy˝ ujtem´eny (GNU) kernel n´elk¨ ul. Nem kellett sok id˝ o ahhoz, hogy egym´asra tal´aljanak, ´ıgy sz¨ uletett meg a Linux, aminek az el˝ oz˝ oek miatt a legpontosabb elnevez´ese: GNU/Linux. Ma m´ar a GNU programokon k´ıv¨ ul m´as projektb˝ ol, m´ as licencel´essel terjesztett szoftverek is tartoz(hat)nak egy disztrib´ uci´ohoz, ´ıgy ma a Linux alatt a teljes oper´ aci´ os rendszert ´ertj¨ uk. P´ar ´ev, ´es megjelentek az els˝o disztrib´ uci´ok: a kernel ´es a rengeteg GNU alkalmaz´ as k¨oz¨ ul n´eh´any ¨ossze´ep´ıtve egy j´ol haszn´alhat´o rendszerr´e (pl.: Debian: 1993. augusztus 16.). Egy Linux disztrib´ uci´ o alatt teh´ at egy gondosan ¨osszev´alogatott, rendszermagb´ol, felhaszn´al´oi´es rendszerszint˝ u programokb´ ol ´ all´ o, szerte´agaz´o vagy specifikus felhaszn´al´asra alkalmas oper´acios rendszert ´ert¨ ´ unk. Egy-egy nagyobb disztrib´ uci´oban olyan sok program tal´alhat´o, hogy nagyon ritk´ an van sz¨ uks´eg k¨ uls˝ o forr´ asb´ ol sz´ armaz´o programok telep´ıt´es´ere. Ennek az az el˝onye, hogy a szoftverkomponensek egym´ ashoz alak´ıthat´ok, az egy¨ uttes install´al´asuk ´es alkalmaz´asuk a lehet˝ o legkevesebb m´ert´ekben vezet hib´ as m˝ uk¨od´esre. S˝ot, a szoftvercsomagok egym´asra ´ep¨ ul´ese is megadhat´ o, ´ıgy egy szoftver install´ al´ asakor a sz¨ uks´eges komponensek automatikusan telep´ıthet˝ ok, illetve az opcion´ alis komponensek telep´ıt´es´ere felh´ıvhatja a felhaszn´al´o figyelm´et. Mindezek miatt a csomagok szigor´ u verzi´ osz´ amoz´assal vannak ell´atva, ´es az install´al´ashoz csomagkezel˝ ot haszn´ alunk, ami a fenti f¨ ugg˝ os´egeket ellen˝orzi ´es az install´al´as ´ota kiadott friss´ıt´eseket is nyomon k¨ oveti. 1.3.1. Disztrib´ uci´ ok k¨ oz¨ otti leggyakoribb ku onbs´ egek ¨ l¨ A disztrib´ uci´ okat legt¨ obbsz¨ or az k¨ ul¨ onb¨ozteti meg, hogy milyen c´elk¨oz¨ons´egnek ´es milyen feladatra k´esz´ıtik ˝ oket, ´ıgy mindenki megtal´alhatja a neki legink´abb megfelel˝ot. L´eteznek olyanok, melyek lehet˝ os´eget ny´ ujtanak arra, hogy szinte az ¨osszes konfigur´al´asi lehet˝os´eget egy grafikus fel¨ uleten v´egezz¨ uk el ´es vannak olyanok is, amelyek megk¨ovetelik, hogy a felhaszn´al´o mindent a konfigur´ aci´ os ´ allom´ anyok szerkeszt´es´evel ´all´ıtson be a saj´at ´ızl´es´enek megfelel˝oen. Egyes disztrib´ uci´ ok c´elja, hogy mindig a lehet˝ o legfrissebb szoftvereket sz´all´ıtsa, m´ıg m´asok j´ol kitesztelt, stabil, ´ am emiatt kiss´e elavult csomagokat sz´all´ıtanak. A legt¨obb disztr´o adott k¨oz¨ons´eget c´eloz meg: profi vagy kezd˝ o felhaszn´ al´ okat, adminisztr´atorokat, buher´atorokat”, kev´es mem´ori´aval ” rendelkez˝ o vagy csak CD-t tartalmaz´ o g´epeket stb. N´eh´any disztr´o a grafikus k¨ornyezetet, m´ıg m´ asok ink´ abb a karakteres konzolt t´ amogatj´ak. 2
Tov´ abbi fontos k¨ ul¨ onbs´eg, hogy milyen csomagkezel˝ot haszn´alnak az adott terjeszt´esben. A k¨ onyvt´ arstrukt´ ura ´ altal´ aban hasonl´ o m´odon van fel´ep´ıtve, viszont kisebb k¨ ul¨onbs´egek ad´odhatnak e tekintetben is, extr´em esetekben teljesen elt´er˝o fel´ep´ıt´est is alkalmaznak a disztrib´ utorok (pl.: GoboLinux). A disztr´ ok egyik f˝o jellemz˝oje az egyes programcsomagok install´al´as´anak, elt´ avol´ıt´ as´ anak ´es friss´ıt´es´enek megk¨ onny´ıt´ese ´es t´amogat´asa. A csomagkezel˝ok a rengeteg feltelep´ıthet˝ o program karbantart´ as´ at, friss´ıt´es´et, telep´ıt´es´et, stb. teszik k¨onnyebb´e: p´eld´aul a GNU/Debian 7 eset´eben kb. 37000 k¨ ul¨onb¨oz˝o program k¨oz¨ ul v´alogathatunk, ´ıgy szinte biztosan megtal´ aljuk a felmer¨ ult feladataink megold´as´ahoz sz¨ uks´eges szoftvereket e b˝os´eges v´alaszt´ekban. Az egyes programok, csomagok pontos verzi´o sz´ammal vannak ell´atva, egy-egy program megfelel˝ o m˝ uk¨od´es´ehez sz¨ uks´eg lehet m´ as programokra is, azaz f¨ ugg˝os´egei lehetnek. Ezen f¨ ugg˝os´egek (lehet˝ oleg automatikus) feltelep´ıt´es´et is a csomagkezel˝ok v´egzik. Hardvert´ amogat´ as ter´en is ad´ odhatnak k¨ ul¨onbs´egek, viszont alapvet˝oen mind ugyanazt a kernelt haszn´ alj´ ak, ´ıgy elviekben ha egy disztrib´ uci´o alatt egy hardver m˝ uk¨odik, akkor az b´armely m´ as, az adott architekt´ ur´ at t´ amogat´o disztrib´ uci´o alatt is m˝ uk¨od´esre b´ırhat´o. Vannak c´eldisztrib´ uci´ ok is, p´eld´ aul kifejezetten t˝ uzfal vagy router u ul¨onb¨oztethetj¨ uk ¨zemeltet´es´ere. Megk¨ oket az alapj´ ˝ an is, hogy server, desktop vagy embedded felhaszn´al´asra sz´anj´ak. A disztr´ ok nagy r´esz´enek k´esz´ıt˝ oi komolyan veszik a biztons´agi probl´em´akat, ´es az ismert hib´ ak jav´ıt´ asait r¨ ovid id˝ on bel¨ ul el´erhet˝ov´e teszik disztr´ojuk csomagfriss´ıt´esi m´odszer´enek seg´ıts´eg´evel. Nagy elt´er´esek vannak a disztr´ ok kiad´asai k¨oz¨ott eltelt id˝oben; egyes disztr´ok fix ciklust alkalmaznak (p´eld´ aul 6 h´ onaponk´ent egy u ´j kiad´as), m´as disztr´okn´al nincs k¨ot¨ott kiad´asi ciklus. L´eteznek kereskedelmi terjeszt´esek ´es v´allalati ´es otthoni / kis irodai disztrib´ uci´ok is. Nem mindegyik disztr´ o ugyanazt a kernel verzi´ot haszn´alja, tov´abb´a sok disztr´o saj´at ig´enyeinek megfelel˝ oen m´ odos´ıtja a hivatalosan kiadott, u ´n. vanilla kernelt.” ” A nagyobb ´es ismertebb disztrib´ uci´ok (a teljess´eg ig´enye n´elk¨ ul): • UHU-Linux, magyar Linux-disztrib´ uci´o • Debian GNU/Linux • Ubuntu, Kubuntu, Xubuntu • Mandriva • Red Hat • Fedora • CentOS • openSUSE • Slackware • Gentoo • Arch Linux • Knoppix, Damn Small Linux, Live CD-k´ent val´o futtat´asra tervezve • CrunchBang Linux Egy kis ´erdekess´eg: http://futurist.se/gldt/wp-content/uploads/12.10/gldt1210.svg
2. Programok futtat´ asa Nagyon fontos, hogy a jegyzet h´ atral´ev˝o r´esz´eben szerepl˝o parancsokat kipr´ob´aljuk! Erre t¨obb lehet˝ os´eg¨ unk ad´ odik: • egy m´ ar telep´ıtett linux verzi´ o haszn´alat´aval,
3
• a putty programmal bel´ep¨ unk valamely egyetemi szerverre (users, cortex) ´es ott dolgozunk • egy let¨ olt¨ ott ´es futtatott live CD/DVD/pendrive haszn´alat´aval (pl.: http://live.debian.net) • u ´j linux telep´ıt´es´evel (pl.: http://debian.org) B´ armelyik m´ odot is haszn´ aljuk, a bel´ep´es ut´an a k¨ovetkez˝o(h¨oz hasonl´o) promptot kell kapnunk (ha grafikus fel¨ uletet haszn´ alunk, a bel´ep´es ut´an el kell ind´ıtani a Terminal vagy xterm vagy valamilyen hasonl´ o nev˝ u alkalmaz´ ast): bercin@users:~$ Ez a prompt a parancs´ertelmez˝ o [shell] k´esz ´allapot´at jel¨oli, kezdhetj¨ uk beg´epelni a parancsokat. Mi a jegyzetben a bash parancs´ertelmez˝ot t´argyaljuk. A legt¨obb Linux disztrib´ uci´oban, illetve egy´eb UNIX-okon is ezt a shellt (vagy ezzel az ´altalunk t´argyaltak szempontj´ab´ol t´ ulnyom´o t¨ obbs´eg´eben kompatibilis v´ altozatot) haszn´alnak. Figyelem! A Linux (´es a UNIX-ok) a kis- ´es nagybet˝ uket k¨ ul¨onb¨oz˝o bet˝ uknek tekintik mind a f´ ajl- ´es k¨ onyvt´ arnevek, mind a parancsok neveinek (s˝ot, a parancsok param´etereinek) megad´asakor. K¨ ul¨ on¨ osen u unk a helyes haszn´alatra! ¨gyelj¨
2.1. Param´ eterek Az echo program feladata, hogy ki´ırja a param´eterk´ent ´atadott sztringeket: bercin@users:~$ echo ABCD ABCD bercin@users:~$ echo EFGH IJKL MNO EFGH IJKL MNO bercin@users:~$ Itt teh´ at az echo a futtatott program, ami az els˝o esetben egyetlen param´etert kap: ABCD, m´ıg a m´ asodik esetben h´ arom ´ atadott param´eter van, amik a k¨ovetkez˝ok: EFGH, IJKL, MNO. A param´etereket a legt¨ obb esetben sz´ ok¨ oz karakter v´alasztja el egym´ast´ol. A parancsokr´ ol b˝ ovebb inform´ aci´ ot a man (manual - k´ezik¨onyv) paranccsal lehet k´erni. P´eld´aul az echo parancsr´ ol ´ıgy: bercin@users:~$ man echo A man parancs param´etere annak a parancsnak a neve, aminek a k´ezik¨onyv´et meg akarjuk jelen´ıteni. A megjelen´ıtett k´ezik¨ onyvben a kurzormozgat´o billenty˝ ukkel tudunk navig´alni, ´es a q billenty˝ uvel tudunk kil´epni (quit). A programok t¨ obbs´eg´enek van man oldala, amiket a k´es˝obbiekben t´argyalt parancsok eset´eben is ´erdemes megn´ezni, mert a jegyzetben a parancsok lehet˝os´egeinek csak t¨ored´ek´et t´argyaljuk. Mag´ ar´ ol a parancs´ertelmez˝ or˝ ol p´eld´ aul a k¨ovetkez˝o m´odon lehet b˝ovebb inform´aci´ot szerezni: bercin@users:~$ man bash 2.1.1. feladat. Hogyan lehet a man parancs k´ezik¨onyv´et megn´ezni?
3. K¨ onyvt´ arak ´ es el´ er´ esi utak Minden futtatott program valamilyen k¨onyvt´arban fut, amit a program aktu´ alis k¨ onyvt´ ar ´anak [(current) working directory] nevez¨ unk. Ez a shell eset´eben is ´ıgy van. Az aktu´alis k¨onyvt´arat a cd (change directory) paranccsal v´ altoztathatjuk meg: param´eterk´ent annak a k¨onyvt´arnak a nev´et kell megadni, amibe be akarunk l´epni. A k¨ onyvt´ arak fa strukt´ ur´ aban ´ abr´azolhat´ok, azaz egy k¨onyvt´arban t¨obb m´asik k¨onyvt´ar (vagy f´ ajl) lehet, amikben ism´et lehetnek u ´jabb k¨onyvt´arak (vagy f´ajlok). Az viszont biztos, hogy minden k¨ onyvt´ arnak egyetlen sz¨ ul˝o k¨onyvt´ara van. Azt az u ´tvonalat (k¨onyvt´arak adott
4
sorrendj´et), amellyel egy adott k¨ onyvt´ arhoz vagy f´ajlhoz eljuthatunk, a k¨onyvt´ar vagy f´ajl el´er´esi u ´tj´ anak nevezz¨ uk. Az el´er´esi u ´tban a k¨onyvt´arakat / jel v´alasztja el egym´ast´ol1 . Minden k¨ onyvt´ arban l´etezik a . k¨ onyvt´ar, ami az aktu´alis k¨onyvt´arat (azaz saj´at mag´at), ´es a .. nev˝ u k¨ onyvt´ ar, ami az adott k¨ onyvt´ar sz¨ ul˝o k¨onyvt´ar´at jel¨oli. Pr´ob´aljuk ki: bercin@users:~$ cd . bercin@users:~$ Nem szabad meglep˝ odni, hogy nem t¨ort´ent semmi, mert az aktu´alis k¨onyvt´arb´ol az aktu´alis k¨ onyvt´ arba l´epni nyilv´ an semmilyen v´altoz´ast nem okozhat. Ugyanakkor a .. (azaz a sz¨ ul˝o) k¨ onyvt´ arba l´ep´es m´ ar nem haszontalan: bercin@users:~$ cd .. bercin@users:/home$ Ennek a parancsnak az eredm´enye alapj´an l´athat´ov´a v´alt: a parancs´ertelmez˝o eddig is ki´ırta, hogy ´eppen melyik k¨ onyvt´ arban vagyunk, csak erre eddig nem ford´ıtottunk figyelmet: most, a doll´ arjel el˝ otti /home azt jelzi, hogy az aktu´alis k¨onyvt´ar a /home-ra v´altozott. Az eddig ott szerepl˝ o ~ (hull´ amjel, tilde) r¨ ovid´ıt´es az alap´ertelmezett k¨onyvt´arunkat jelezte. Linux (UNIX) alatt alap´ertelmezett esetben a felhaszn´al´oknak van egy k¨onyvt´ara, ahova a felhaszn´al´o ´ır´asi joggal rendelkezik, ´es ebbe a k¨ onyvt´ arba ker¨ ul, amikor bel´ep a szerverre. Ez a k¨onyvt´ar a /home/felhaszn´ al´ on´ ev (ahol felhaszn´ al´ on´ ev a saj´at felhaszn´al´onk neve) amit a felhaszn´al´o home k¨ onyvt´ ar ´ anak [home directory] nevez¨ unk. A cd .. parancs teh´at a /home/felhaszn´ al´ on´ ev k¨ onyvt´ arb´ ol ennek sz¨ ul˝ o k¨ onyvt´ ar´ aba, azaz a /home k¨onyvt´arba vitt, ´es a parancs´ertelmez˝o ezt a v´ altoz´ ast jelezte a promptban. Az aktu´ alis k¨ onyvt´ ar neve lek´erdezhet˝o a pwd (print working directory) parancs seg´ıts´eg´evel: bercin@users:/home$ pwd /home bercin@users:/home$ cd .. bercin@users:/$ pwd / bercin@users:/$ A / nev˝ u k¨ onyvt´ ar a f´ ajlrendszer gy¨ ok´er k¨onyvt´ar´at jel¨oli, azaz azt a k¨onyvt´art, aminek a sz¨ ul˝o k¨ onyvt´ ara is saj´ at maga, ´ıgy ebb˝ ol a k¨onyvt´arb´ol feljebb m´ar nem lehet l´epni: bercin@users:/$ pwd / bercin@users:/$ cd .. bercin@users:/$ pwd / bercin@users:/$ Ha az el´er´esi u ´t / jellel kezd˝ odik, akkor az el´er´esi utat teljes el´er´esi u ´tnak [full path] nevezz¨ uk. A pwd parancs mindig az aktu´ alis k¨ onyvt´ar teljes el´er´esi u ´tj´at ´ırja ki: bercin@users:/$ pwd / bercin@users:/$ cd home bercin@users:/home$ pwd /home bercin@users:/home$ cd bercin bercin@users:~$ pwd /home/bercin bercin@users:~$ 1 Figyelem! A k¨ onyvt´ ar elv´ alaszt´ o jel Linuxban (´ es UNIX-ban) jobbra d˝ ol˝ o” perjel, nem az, amit a Windows ” haszn´ al (ahol balra d˝ ol˝ o” perjel v´ alasztja el a k¨ onyvt´ arakat). ”
5
Ha az el´er´esi u ´t nem / jellel kezd˝ odik, akkor is el´er´esi u ´tr´ol besz´el¨ unk, de ezt az el´er´esi utat relat´ıv el´er´esi u ´tnak [relative path] nevezz¨ uk. A relat´ıv el´er´esi u ´t azt jelenti, hogy az el´er´esi u ´t nem a gy¨ ok´er k¨ onyvt´ art´ ol, hanem az aktu´ alis k¨onyvt´art´ol indul. bercin@users:~$ pwd /home/bercin bercin@users:~$ cd /usr bercin@users:/usr$ pwd /usr bercin@users:/$ cd local/bin bercin@users:/usr/local/bin$ pwd /usr/local/bin bercin@users:/usr/local/bin$ A param´eter n´elk¨ uli cd parancs visszavisz minket a home k¨onyvt´arunkba (b´armi is az aktu´alis k¨ onyvt´ ar): bercin@users:/usr/local/bin$ pwd /usr/local/bin bercin@users:/usr/local/bin$ cd bercin@users:~$ pwd /home/bercin bercin@users:~$ ´ k¨ Uj onyvt´ arat az mkdir paranccsal hozhatunk l´etre, u ¨res k¨onyvt´arat az rmdir paranccsal t¨or¨olhet¨ unk: bercin@users:~$ mkdir teszt bercin@users:~$ cd teszt bercin@users:~/teszt$ pwd /home/bercin/teszt bercin@users:~/teszt$ cd .. bercin@users:~$ rmdir teszt bercin@users:~$
4. K¨ ornyezeti v´ altoz´ ok A programok sz´ am´ ara t¨ obbf´elek´eppen adhat´ok ´at adatok, aminek az egyik m´odja az el˝oz˝o p´eld´ akban is l´ athat´ o parancssori param´eterk´ent ´atad´as. Egy m´asik m´odja a k¨ornyezeti v´altoz´okon kereszt¨ ul t¨ ort´enik, amit a programok a fut´asuk sor´an lek´erdezhetnek (´es m´odos´ıthatnak). A k¨ ornyezeti v´ altoz´ ok a parancs´ertelmez˝ ob˝ol t¨ort´en˝o kil´ep´essel t¨orl˝odnek. Egy k¨ ornyezeti v´ altoz´ onak u ´gy lehet ´ert´eket adni, hogy a v´altoz´o neve ut´an egy egyenl˝os´eg jelet majd a be´ all´ıtani k´ıv´ ant ´ert´eket ´ırjuk. P´eld´aul a PLD v´altoz´onak az abcd ´ert´ek¨ ul ad´asa a k¨ ovetkez˝ o m´ odon t¨ ort´enik: bercin@users:~$ PLD=abcd bercin@users:~$ Az aktu´ alis ´ert´eket a v´ altoz´ on´ev el´e tett $ jellel lehet lek´erdezni oly m´odon, hogy a parancssorban szerepl˝ o $v´ altoz´ on´ ev sz¨ oveget a shell a v´ altoz´ on´ ev nev˝ u v´altoz´o aktu´alis ´ert´ek´ere cser´eli ki, majd a parancssort u ´jra ´ertelmezi. P´eld´aul az echo $PLD ´ertelmez´ese a k¨ovetkez˝ok´eppen t¨ort´enik: A shell el˝ osz¨ or kicser´eli a $PLD sztringet a PLD v´altoz´o ´ert´ek´ere (ami jelen esetben abcd), ´ıgy eredm´eny¨ ul az echo abcd parancssort kapja, amit azt´an u ´jra ´ertelmez ´es v´egrehajt: bercin@users:~$ echo $PLD abcd bercin@users:~$
6
Nagyon fontos ism´etelten hangs´ ulyozni, hogy a shell v´egzi a $PLD sztring kicser´el´es´et a v´altoz´o tartalm´ ara, nem pedig a futtatott program! A program m´ar csak a kicser´elt sztringet kapja meg param´eterk´ent, mit sem sejtve arr´ ol, hogy az eredetileg mi volt: az el˝oz˝o p´eld´aban az echo teh´at m´ ar csak az abcd param´etert kapja meg (amit azt´an ki´ır). A shellben t´ arolt k¨ ornyezeti v´ altoz´ok list´aj´at aktu´alis ´ert´ekeikkel egy¨ utt a set paranccsal kaphatjuk meg.
¨ 4.1. Osszef˝ uz´ es Sz¨ uks´eg¨ unk lehet arra, hogy egy k¨ ornyezeti v´altoz´o aktu´alis ´ert´eke el´e ´es/vagy m¨og´e egy m´asik sztringet is besz´ urjunk. ´Irassuk ki k´et k¨ornyezeti v´altoz´o ´ert´ek´et egym´ashoz f˝ uzve: bercin@users:~$ ELEJE=abcd bercin@users:~$ VEGE=efgh bercin@users:~$ echo $ELEJE$VEGE abcdefgh bercin@users:~$ A sikeren felbuzdulva megpr´ ob´ alhatunk egy k¨ornyezeti v´altoz´o ´ert´ek´ehez k¨ozvetlen¨ ul hozz´af˝ uzni egy sztringet: bercin@users:~$ echo $ELEJEefgh bercin@users:~$ echo $ELEJE abcd bercin@users:~$ echo efgh efgh bercin@users:~$ Az utas´ıt´ as az´ert nem m˝ uk¨ odik (pontosabban m˝ uk¨odik, csak nem azt az eredm´enyt adja, amit v´ artunk), mert a shell nem tudja, hogy mi az ELEJE k¨ornyezeti v´altoz´o ´ert´ek´et ´es a efgh sztringet akartuk ¨osszef˝ uzni, hanem az ELEJEefgh nev˝ u k¨ornyezeti v´altoz´o ´ert´ek´et k´erdezi le, ami u ¨res. A megold´ as, hogy a {} karakterek k¨ oz´e ´ırva a k¨ornyezeti v´altoz´o nev´et, a shell m´ar pontosan meg fogja tudni hat´ arozni, hogy meddig tart a k¨ornyezeti v´altoz´o neve, ´es honn´et kezd˝odik a parancssor t¨ obbi r´esze: bercin@users:~$ echo ${ELEJE}efgh abcdefgh bercin@users:~$ Term´eszetesen ez a jel¨ ol´esm´ od az el˝ oz˝ o p´eld´akkal is haszn´alhat´o: bercin@users:~$ echo ${ELEJE} abcd bercin@users:~$ echo ${VEGE} efgh bercin@users:~$ echo ${ELEJE}${VEGE} abcdefgh bercin@users:~$
4.2. PATH Mag´ anak a parancs´ertelmez˝ onek is sz¨ uks´ege van n´eh´any be´all´ıt´asra a m˝ uk¨od´es´ehez, ilyen p´eld´aul a PATH nev˝ u k¨ ornyezeti v´ altoz´ o, ami megadja, hogy melyik k¨onyvt´arakban kell keresni a beg´epelt parancsokat. ´Irassuk ki a PATH v´ altoz´o aktu´alis ´ert´ek´et a fentebb ismertetett m´odon: bercin@users:~$ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/games bercin@users:~$ 7
Eredm´eny¨ ul teljes el´er´esi utak kett˝ osponttal elv´alasztott sorozat´at kapjuk, ami azt mutatja, hogy a beg´epelt parancsok keres´ese kiz´ ar´ olag mely k¨onyvt´arakban t¨ort´enik. Eset¨ unkben ezek a /usr/local/bin, /usr/bin, /bin ´es a /usr/games k¨onyvt´arak (ebben a sorrendben!). Ha a beg´epelt parancsot ezen k¨ onyvt´ arak valamelyik´eben megtal´alja a parancs´ertelmez˝o, akkor azt lefuttatja. Ha nincs ilyen f´ ajl, akkor hibajelz´est ad: bercin@users:~$ svnsjkvnasjlvn -bash: svnsjkvnasjlvn: command not found bercin@users:~$ A which paranccsal megtudhatjuk, hogy egy (l´etez˝o) program pontosan melyik, PATH-ban l´ev˝o k¨ onyvt´ arban tal´ alhat´ o. P´eld´ aul az echo program el´er´esi u ´tja: bercin@users:~$ which echo /bin/echo bercin@users:~$ A which programot b´ armely m´ asik programra megh´ıvhatjuk, ak´ar saj´at mag´ara is (ekkor azt fogja ki´ırni, hogy ˝ o maga hol tal´ alhat´ o): bercin@users:~$ which which /usr/bin/which bercin@users:~$
4.3. PS1 A PS1 k¨ ornyezeti v´ altoz´ oval be´ all´ıthatjuk a parancs´ertelmez˝o promptj´at. Miel˝ott ezt megv´altoztatn´ ank, ments¨ uk el a r´egi ´ert´eket p´eld´aul a MENTES k¨ornyezeti v´altoz´oba: bercin@users:~$ MENTES=$PS1 bercin@users:~$ A k¨ ornyezeti v´ altoz´ o lek´erdez´es´et nyilv´an nem csak az echo paranccsal haszn´alhatjuk, hanem b´ armelyik m´ asik paranccsal is. Id´ezz¨ uk fel a k¨ornyezeti v´altoz´o ´ert´ek´enek a lek´erdez´es´et: el˝osz¨or a shell kicser´eli a $v´ altoz´ on´ ev kifejez´est a v´ altoz´ on´ ev ´ert´ek´ere, majd az ´ıgy kapott sort u ´jra ´ertelmezi. Az el˝ oz˝ o p´eld´ aban teh´ at a $PS1 hely´ere behelyettes´ıt˝od¨ott a PS1 ´ert´eke, amit azt´an a MENTES v´ altoz´ onak adtunk ´ert´ek¨ ul. A PS1 ´ at´ all´ıt´ asa ut´ an az u ´j prompttal ugyan´ ugy haszn´alhatjuk a parancs´ertelmez˝ot, mint eddig (ne lep˝ odj¨ unk meg, hogy furcs´ an n´ez ki a sor, u ´gy g´epelj¨ uk be a parancsainkat, mintha az el˝ oz˝ oekben megszokott prompt lenne!): bercin@users:~$ PS1=_ez_az_en_promptom_ _ez_az_en_promptom_echo szia szia _ez_az_en_promptom_which echo /bin/echo _ez_az_en_promptom_ N´ezz¨ uk meg, hogyan ´ all´ıthatjuk vissza az eredeti ´allapotot: _ez_az_en_promptom_PS1=$MENTES bercin@users:~$ 4.3.1. feladat. Mi a PS1 (vagy a MENTES) tartalma? A PS1 be´ all´ıt´ as´ ar´ ol a k´es˝ obbiekben lesz m´eg sz´o b˝ovebben.
8
4.4. LANG A LANG k¨ ornyezeti v´ altoz´ o be´ all´ıt´ as´ aval ´at´all´ıthatjuk a ter¨ uleti be´all´ıt´asokat, ´ıgy p´eld´aul megv´al´ ek¨ toztathatjuk a parancsok ´ altal ki´ırt u ul a haszn´alni k´ıv´ant nyelv k´etbet˝ us ¨zenetek nyelv´et. Ert´ k´ odj´ at kisbet˝ ukkel ´es az orsz´ ag k´etbet˝ us k´odj´at nagybet˝ ukkel kell megadni, al´ah´ uz´asjellel elv´alasztva: bercin@users:~$ svnsjkvnasjlvn -bash: svnsjkvnasjlvn: command not found bercin@users:~$ LANG=hu_HU bercin@users:~$ svnsjkvnasjlvn -bash: svnsjkvnasjlvn: parancs nem tal´ alhat´ o bercin@users:~$ Ha a magyarul ki´ırt hiba¨ uzenetben az ´ekezetes bet˝ uk hely´en k´erd˝ojel, vagy egy´eb m´as furcsa” ” karakter szerepel, akkor a hu_HU helyett pr´ob´aljuk ki a hu_HU.UTF8 ´ert´eket. Az UTF-8 karakterk´ odol´ asr´ ol a k´es˝ obbiekben lesz r´eszletesen sz´o. 4.4.1. feladat. Hogyan tudjuk a be´ all´ıt´as el˝ott elmenteni ´es az ´at´all´ıt´as ut´an az eredetire visszaall´ıtani a LANG k¨ ´ ornyezeti v´ altoz´ ot? 4.4.2. feladat. Hogyan tudjuk ´ at´ all´ıtani a ter¨ uleti be´all´ıt´asokat a N´emetorsz´agban haszn´alt n´emetre? 4.4.3. feladat. Hogyan tudjuk ´ at´ all´ıtani a ter¨ uleti be´all´ıt´asokat az USA (d´elnyugati r´esz´en gyakran) haszn´ alt spanyolra?
5. F´ ajlok kezel´ ese Az ls paranccsal kilist´ azhat´ o az aktu´alis k¨onyvt´ar tartalma (ha nem adunk meg param´etert) vagy b´ armely m´ as k¨ onyvt´ ar tartalma (ha megadunk egy el´er´esi utat): bercin@users:~$ ls public_html teszt ZHk bercin@users:~$ ls /bin bash dd bunzip2 df bzcat dir bzcmp dmesg bzdiff dnsdomainname bzegrep domainname bzexe echo bzfgrep ed bzgrep egrep bzip2 false bzip2recover fgrep bzless fuser bzmore getfacl cat grep chacl gunzip chgrp gzexe chmod gzip chown hostname cp ip cpio kill dash ksh date less bercin@users:~$
lessecho lessfile lesskey lesspipe ln login ls lsmod mkdir mknod mktemp more mount mountpoint mt mt-gnu mv nano nc nc.traditional netcat netstat
9
nisdomainname pidof ping ping6 ps pwd rbash readlink rm rmdir rnano run-parts rzsh sed setfacl sh sh.distrib sleep stty su sync tailf
tar tempfile touch true umount uname uncompress vdir which ypdomainname zcat zcmp zdiff zegrep zfgrep zforce zgrep zless zmore znew zsh zsh4
Ebben a p´eld´ aban az aktu´ alis k¨ onyvt´ ar elemeit (els˝o-m´asodik sor) ´es a /bin k¨onyvt´ar elemeit list´ aztuk ki (harmadik sort´ ol az utols´ oig). Egy u ´jonnan l´etrehozott k¨ onyvt´ ar is tartalmazza a . ´es .. k¨onyvt´arakat, de ezeket az ls alap´ertelmezetten nem mutatja: bercin@users:~$ mkdir teszt bercin@users:~$ cd teszt bercin@users:~/teszt$ ls bercin@users:~/teszt$ Linuxban (´es UNIX-ban) a ponttal kezd˝od˝o k¨onyvt´arnevek ´es f´ajlnevek rejtettek, azaz az ls alap´ertelmezetten nem list´ azza ki ezeket. Ha az ls parancsot a -a param´eterrel h´ıvjuk meg, akkor m´ ar megmutatja a ponttal kezd˝ od˝o k¨onyvt´arakat illetve ´allom´anyokat is: bercin@users:~/teszt$ ls -a . .. bercin@users:~/teszt$ Term´eszetesen a . ´es .. k¨ onyvt´ ar minden k¨onyvt´arban megtal´alhat´o, b´armelyiket is list´azzuk ki: bercin@users:~/teszt$ cd bercin@users:~$ ls public_html teszt ZHk bercin@users:~$ ls -a . .bash_history .bashrc .. .bash_logout .gnupg bercin@users:~$
.lesshst .mc
.profile public_html
.ssh teszt
ZHk
J´ ol l´ athat´ o ezen a p´eld´ an, hogy a . ´es .. k¨onyvt´arak mellett egy felhaszn´al´o home k¨onyvt´ara altal´ ´ aban sok m´ as, ponttal kezd˝ od˝ o f´ ajlt is tartalmaz, amik az el˝oz˝oek alapj´an szint´en rejtettek. Linux (UNIX) eset´eben a felhaszn´ al´o ´altal futtatott programok be´all´ıt´asait ´altal´aban ponttal kezd˝ od˝ o f´ ajlnev˝ u´ allom´ anyban t´ aroljuk. A programjaink config f´ajljai teh´at az´ert a felhaszn´al´o home k¨ onyvt´ ar´ aban vannak, mert ´ıgy lehet˝ov´e v´alik, hogy felhaszn´al´onk´ent m´as ´es m´as be´all´ıt´asok legyenek. Sz¨ uks´egszer˝ u is itt t´ arolni a config ´allom´anyokat, hiszen ezek m´ashol nem biztos, hogy t´ arolhat´ ok, mert ´ altal´ anos esetben a felhaszn´al´onak csak a home k¨onyvt´ar´aban van ´ır´asi joga. F´ ajlokat m´ asolni a cp (copy) paranccsal lehet, aminek els˝o param´eterk´ent meg kell adni azt az el´er´esi utat, amit m´ asolni szeretn´enk, m´asodik param´eterk´ent pedig azt az el´er´esi utat, ahova m´ asolni szeretn´enk. P´eld´ aul a m´ar j´ol ismert echo programot m´asoljuk a saj´at home k¨ onyvt´ arunkba masik_echo n´even: bercin@users:~$ cp /bin/echo masik_echo bercin@users:~$ ls masik_echo public_html teszt ZHk bercin@users:~$ Hi´ aba l´etezik az aktu´ alis k¨ onyvt´ arban a masik_echo f´ajl, ha a megpr´ob´aljuk lefuttatni, hibajelz´est kapunk: bercin@users:~$ masik_echo -bash: masik_echo: command not found bercin@users:~$ Ennek magyar´ azata, hogy a shell kiz´ ar´ olag a PATH k¨ornyezeti v´altoz´oban felsorolt k¨onyvt´arakban keres, ´es ezek k¨ oz¨ ott nem tal´ alhat´ o meg az aktu´alis k¨onyvt´ar: bercin@users:~$ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/games bercin@users:~$
10
A probl´em´ at egyszer˝ uen orvosolhatjuk: a parancsn´ev helyett adjuk meg a futtatand´o parancs el´er´esi u ´tj´ at, ´ıgy a shellnek nem kell a PATH-ban l´ev˝o k¨onyvt´arakban keresnie, hanem k¨ozvetlen¨ ul a megadott f´ ajlt pr´ ob´ alja meg futtatni. El´er´esi u ´tk´ent megadhat´o teljes el´er´esi u ´t: bercin@users:~$ /home/bercin/masik_echo szia szia bercin@users:~$ ´ megadhat´ Es o relat´ıv el´er´esi u ´t is: bercin@users:~$ ./masik_echo szia szia bercin@users:~$ A shell u ´gy tudja megk¨ ul¨ onb¨ oztetni, hogy relat´ıv el´er´esi utat vagy el´er´esi u ´t n´elk¨ uli parancsnevet adtunk meg, hogy ha a parancsban nincsen / karakter, akkor parancsn´evr˝ol van sz´o (´es a PATHban megadott k¨ onyvt´ arakban keresi a parancsot), de ha van benne / karakter, akkor el´er´esi u ´tr´ol van sz´ o (s˝ ot, ha az el´er´esi u ´t / jellel kezd˝odik, akkor abszol´ ut el´er´esi u ´t, azaz a gy¨ok´er k¨onyvt´art´ol indul, ha nem / jellel kezd˝ odik, akkor relat´ıv, azaz az aktu´alis k¨onyvt´art´ol indul). Pontosan az´ert volt teh´ at sz¨ uks´eg az el˝oz˝o p´eld´aban a ./ szerepeltet´es´ere, hogy a shell tudja, el´er´esi u ´ttal megadott parancsot akarunk futtatni, ´es a . k¨onyvt´ar megad´as´aval ez pontosan azt jelenti, hogy az aktu´ alis k¨ onyvt´ arban l´ev˝o f´ajlr´ol van sz´o. Erre a probl´em´ ara az el˝ oz˝ o megold´ason k´ıv¨ ul m´asik k´et megold´as is l´etezik: az egyik, hogy az aktu´ alis k¨ onyvt´ arat (teh´ at a . k¨ onyvt´arat) is beillesztj¨ uk a PATH list´aba, a m´asik, hogy l´etrehozunk egy saj´ at k¨ onyvt´ arat a home k¨onyvt´arunkban, ahol a saj´at futtathat´o ´allom´anyainkat fogjuk t´ arolni. Az els˝ o megold´ as biztons´agi kock´azatokat rejt (ez´ert nem is keres a shell az aktu´ alis k¨ onyvt´ arban), ´ıgy v´ alasszuk a m´asodik megold´ast. H´ıvjuk ezt a k¨onyvt´arat bin-nek: bercin@users:~$ mkdir bin bercin@users:~$ PATH=$PATH:~/bin bercin@users:~$ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/games:/home/bercin/bin bercin@users:~$ L´etrehoztuk teh´ at a bin k¨ onyvt´ arat a home k¨onyvt´arunkban, majd a PATH k¨ornyezeti v´altoz´o v´eg´ehez hozz´ af˝ uzt¨ uk ennek az u ´jonnan l´etrehozott k¨onyvt´arnak az el´er´esi u ´tj´at. R´eszletesebben itt k´et csere is t¨ ort´ent: a $PATH:~/bin sztringet a shell ´ertelmezte ´es a $PATH sztringet kicser´elte a PATH k¨ ornyezeti v´ altoz´ o aktu´ alis ´ert´ek´ere, majd a ~ jelet is kicser´elte a felhaszn´al´o home k¨ onyvt´ ar´ anak el´er´esi u ´tj´ ara, ´ıgy eredm´eny¨ ul (ebben az esetben) a /usr/local/bin:/usr/bin:/bin:/usr/games:/home/bercin/bin ´ert´eket kapta. A v´egrehajt´ asi f´ azisban teh´at az t¨ort´et, mintha a PATH=/usr/local/bin:/usr/bin:/bin:/usr/games:/home/bercin/bin parancsot ´ırtuk volna be, ezt bizony´ıtja a PATH k¨ornyezeti v´altoz´o ´ert´eke ki´ırat´as´anak eredm´enye. A feladat megold´ as´ ahoz m´ ar csak egy l´ep´es van h´atra, az aktu´alis k¨onyvt´arban l´ev˝o masik_echo f´ ajlt ´ at kell mozgatni a bin k¨ onyvt´ arba, amit a mv (move) parancs seg´ıts´eg´evel tehet¨ unk meg: bercin@users:~$ ls masik_echo public_html teszt ZHk bercin@users:~$ ls -a bin . .. bercin@users:~$ mv masik_echo bin bercin@users:~$ ls -a bin . .. masik_echo bercin@users:~$ ls bin public_html teszt ZHk bercin@users:~$ 11
Pr´ ob´ aljuk ki, hogy most m´ ar m˝ uk¨ odik-e a masik_echo program ind´ıt´asa, holott az nincs is az aktu´ alis k¨ onyvt´ arban: bercin@users:~$ ls bin public_html teszt ZHk bercin@users:~$ masik_echo szia szia bercin@users:~$ Az mv parancs az ´ atmozgat´ as mellett ´ atnevez´esre is haszn´alhat´o: gondoljunk bele, ha ´atmozgatok egy f´ ajlt az aktu´ alis k¨ onyvt´ arb´ ol az aktu´alis k¨onyvt´arba csak m´asik n´even, akkor val´oj´aban atnevez´est hajtottam v´egre. Emiatt nincs k¨ ´ ul¨on parancs ´atnevez´esre a Linuxban (´es a UNIXokban). Ha a cp vagy mv parancsnak m´ asodik param´eterk´ent (teh´at a c´el el´er´esi u ´tk´ent) k¨onyvt´arat adunk meg, akkor abba a k¨ onyvt´ arba ugyanolyan n´even fog m´asol´odni (cp eset´eben) illetve atmozgat´ ´ odni (mv eset´eben) a forr´ ask´ent megadott f´ajl. Term´eszetesen t¨obb f´ajlt is m´asolhatunk egy paranccsal, ha felsoroljuk az ¨ osszes m´asoland´o f´ajlt, majd az utols´o param´eterk´ent megadjuk azt a k¨ onyvt´ arat, ahova azokat m´ asolni szeretn´enk. Ekkor az utols´o param´eter csak k¨onyvt´ar lehet! bercin@users:~$ masik_echo bercin@users:~$ bercin@users:~$ cp masik_echo bercin@users:~$
ls bin cp /bin/mv /bin/cp /bin/mkdir /bin/rmdir bin ls bin mkdir mv rmdir
F´ ajlok t¨ orl´es´ere az rm parancs szolg´ al, param´eterekk´ent meg kell adni a t¨orlend˝o f´ajlok el´er´esi u ´tjait. P´eld´ aul az im´ent a bin k¨ onyvt´ arba m´asolt ´allom´anyok k¨oz¨ ul n´eh´any t¨orl´ese: bercin@users:~$ ls bin cp masik_echo mkdir mv rmdir bercin@users:~$ rm bin/mv bin/mkdir bin/cp bercin@users:~$ ls bin masik_echo rmdir bercin@users:~$ Term´eszetesen ha egy k¨ onyvt´ ar ¨ osszes f´ajlj´at t¨or¨olni szeretn´enk, nem kell azokat egyes´evel felsorolni, hanem megadhatjuk a k¨ onyvt´ arnevet is az rm parancsnak: bercin@users:~$ rm bin rm: cannot remove ‘bin’: Is a directory bercin@users:~$ Mivel alap´ertelmezetten az rm parancs f´ajlok t¨orl´es´ere szolg´al, k¨ ul¨on param´eter megad´asa sz¨ uks´eges, hogy k¨ onyvt´ arat t¨ or¨ olj¨ unk: -r (rekurz´ıv t¨orl´es) bercin@users:~$ rm -r bin bercin@users:~$ Figyelem! Linuxban (´es UNIX-ban) a t¨orl´es ´altal´aban visszaford´ıthatatlan m˝ uvelet! Nincs Trash” vagy Kuka”, amibe ideiglenesen ´atker¨ ulnek a t¨or¨olt ´allom´anyok! Az rm parancs ki” ” ad´ asakor azok azonnal t¨ orl˝ odnek.
5.1. Mintailleszt´ es A shell nem csak a k¨ ornyezeti v´ altoz´ ok ´ert´ek´enek lek´erdez´es´ere haszn´alt $ jelet ´ertelmezi speci´ alisan, hanem lehet˝ os´eg van a f´ ajlok neveinek mintailleszt´es´ere, azaz a l´etez˝o f´ajlnevek k¨oz¨ ul adott mint´ anak megfelel˝ ok kiv´ alaszt´ as´ ara. A shell ´altal erre a c´elra haszn´alt speci´alis karakterek ´es jelent´eseik az 1. t´ abl´ azatban l´ athat´ oak. 12
illeszt˝ o karakter * ? [karakterek]
karakterek, amelyek megfelelnek a mint´anak b´ armely karakter ak´arh´anyszor (nulla alkalommal is!) b´ armely karakter pontosan egy alkalommal karakterek k¨oz¨ ul b´armelyik pontosan egy alkalommal
1. t´ abl´ azat. A shell mintailleszt˝o karakterei ´ A mintailleszt´est a /bin k¨ onyvt´ arban fogjuk szeml´eltetni. Alljon itt egy lista a benne tal´alhat´o f´ ajlokr´ ol annak ´erdek´eben, hogy a lentebbi p´eld´akat a szerverre val´o bel´ep´es n´elk¨ ul is meg lehessen ´erteni. bercin@users:~$ cd /bin bercin@users:/bin$ ls bash dd bunzip2 df bzcat dir bzcmp dmesg bzdiff dnsdomainname bzegrep domainname bzexe echo bzfgrep ed bzgrep egrep bzip2 false bzip2recover fgrep bzless fuser bzmore getfacl cat grep chacl gunzip chgrp gzexe chmod gzip chown hostname cp ip cpio kill dash ksh date less bercin@users:/bin$
lessecho lessfile lesskey lesspipe ln login ls lsmod mkdir mknod mktemp more mount mountpoint mt mt-gnu mv nano nc nc.traditional netcat netstat
nisdomainname pidof ping ping6 ps pwd rbash readlink rm rmdir rnano run-parts rzsh sed setfacl sh sh.distrib sleep stty su sync tailf
tar tempfile touch true umount uname uncompress vdir which ypdomainname zcat zcmp zdiff zegrep zfgrep zforce zgrep zless zmore znew zsh zsh4
´Irassuk ki a c karakterrel kezd˝ od˝ o f´ ajlokat: bercin@users:/bin$ ls c* cat chacl chgrp chmod bercin@users:/bin$
chown
cp
cpio
A c* mint´ anak teh´ at megfelel minden olyan f´ajl, ami c karakterrel kezd˝odik ´es ut´ana b´armely karakterb˝ ol b´ arh´ any szerepel. A * karakter azonban nem csak a minta v´eg´en lehet, s˝ot, nem csak egy szerepelhet bel˝ ole egy mint´ aban: bercin@users:/bin$ ls *l* bzless getfacl lessecho chacl kill lessfile false less lesskey bercin@users:/bin$
lesspipe ln login
ls lsmod nc.traditional
readlink setfacl sleep
tailf tempfile zless
A *l* mint´ anak megfelel az ¨ osszes olyan f´ajl, amiben legal´abb egy l bet˝ u szerepel. Hasonl´oan egyszer˝ u kilist´ azni azokat a f´ ajlokat, amelyekben legal´abb egy l ´es ut´ana legal´abb egy s bet˝ u szerepel: bercin@users:/bin$ ls *l*s* 13
bzless less lessfile false lessecho lesskey bercin@users:/bin$
lesspipe ls
lsmod zless
Figyelem! A karakterek sorrendje fontos! Az el˝oz˝o minta nem ugyanaz, mint a *s*l*: bercin@users:/bin$ ls *s*l* lessfile setfacl sleep bercin@users:/bin$ 5.1.1. p´ elda. List´ azzuk ki azokat a f´ ajlokat, amelyek m´asodik karaktere e: bercin@users:/bin$ ls ?e* getfacl lessecho lesskey less lessfile lesspipe bercin@users:/bin$
netcat netstat
readlink sed
setfacl tempfile
zegrep
5.1.2. p´ elda. List´ azzuk ki azokat a f´ ajlokat, amelyek m´asodik karaktere e ´es a hatodik karaktere c: bercin@users:/bin$ ls ?e???c* getfacl lessecho setfacl bercin@users:/bin$ 5.1.3. p´ elda. List´ azzuk ki azokat a f´ ajlokat, amelyek pontosan h´arom karakterb˝ol ´allnak: bercin@users:/bin$ ls ??? cat dir ksh pwd sed tar bercin@users:/bin$
zsh
5.1.4. p´ elda. List´ azzuk ki azokat a f´ajlokat, amelyek az abcd karakterek k¨oz¨ ul valamelyikkel kezd˝ odnek ´es utols´ o karakter¨ uk e: bercin@users:/bin$ ls [acbd]*e bzexe bzmore date dnsdomainname bercin@users:/bin$
domainname
A mintailleszt´es term´eszetesen nem csak a f´ajlok kilist´az´as´an´al, hanem m´asol´asn´al (cp), ´atmozgat´ asn´ al (mv), t¨ orl´esn´el (rm) is hasznos, s˝ot – mivel a behelyettes´ıt´est a shell v´egzi – b´armely m´as program is felhaszn´ alhatja ezt a funkci´ot, ha f´ajlok neveit v´arja param´eterk´ent.
5.2. Egy´ eb speci´ alis karakterek Eddig elhallgattuk, de a szemf¨ ules olvas´o m´ar tal´alkozhatott azzal a probl´em´aval, hogy (p´eld´ aul k¨ onyvt´ ar l´etrehoz´ as´ an´ al) a fentiek alapj´an nem tud sz´ok¨oz karaktert tartalmaz´o nevet haszn´ alni, hiszen a sz´ ok¨ oz karakter param´eter elv´alaszt´o karakter, ´ıgy ha megpr´ob´alunk egy Kedves Hallgatok nev˝ u k¨ onyvt´ arat l´etrehozni, akkor azt k´et k¨ ul¨on k¨onyvt´ark´ent fogja a shell l´etrehozni: bercin@users:~$ mkdir Kedves Hallgatok bercin@users:~$ ls bin Hallgatok Kedves public_html teszt bercin@users:~$
ZHk
Hasonl´ o a probl´ema a mintailleszt˝ o karakterek haszn´alat´aval is: bercin@users:~$ mkdir ***K*** mkdir: cannot create directory ‘Kedves’: File exists bercin@users:~$ ls bin Hallgatok Kedves public_html teszt ZHk bercin@users:~$ 14
A hiba¨ uzenet magyar´ azata, hogy a shell a ***K*** mint´at behelyettes´ıti az aktu´alis k¨onyvt´arban tal´ alhat´ o Kedves f´ ajln´evvel (ez l´etez˝ o n´ev, hiszen ´eppen az el˝obb hoztuk l´etre ezt a k¨onyvt´arat), ´ıgy az mkdir parancs a Kedves param´etert kapja, ami nyilv´an hib´ahoz vezet, hiszen nem hozhat´o l´etre egy m´ ar megl´ev˝ o n´evvel u ´j k¨ onyvt´ar. A probl´em´ at u ´gy orvosolhatjuk, hogy a speci´alis karakterek speci´alis jelent´es´et kikapcsoljuk, azaz a kikapcsol´ as ut´ an a karakterek m´ar ¨onmagukat jelentik: a $ karaktert nem pr´ob´alja meg a shell v´ altoz´ o ´ert´ek´ere cser´elni, a mintailleszt˝o karaktereket nem pr´ob´alja meg f´ajlnevekre illeszteni, stb. A speci´ alis jelent´es kikapcsol´ as´ara a \ karakter haszn´aland´o. Figyelem! Itt balra d˝ol˝o” ” perjelr˝ ol van sz´ o, nem a k¨ onyvt´ arakat elv´alaszt´o jobbra d˝ol˝o” perjelr˝ol! ” Egy sz´ ok¨ ozt tartalmaz´ o k¨ onyvt´ ar l´etrehoz´as´ara haszn´alhat´o teh´at a k¨ovetkez˝o m´odszer: bercin@users:~$ mkdir Ez\ itt\ egy\ teljes\ mondat bercin@users:~$ ls bin Ez itt egy teljes mondat Hallgatok Kedves public_html bercin@users:~$
teszt
ZHk
Egy kicsit probl´em´ as minden speci´ alis karakter el´e besz´ urni a \ jelet, de ez a probl´ema is meg van oldva: ha t¨ obb karakter speci´ alis jelent´es´et akarjuk kikapcsolni, akkor a sztringet ’ jelek k¨oz´e kell tenni: bercin@users:~$ mkdir ’Ez itt egy masik hosszu nevu konyvtar’ bercin@users:~$ ls bin Hallgatok teszt Ez itt egy masik hosszu nevu konyvtar Kedves ZHk Ez itt egy teljes mondat public_html bercin@users:~$ N´eha azonban m´egis sz¨ uks´eg lenne arra, hogy k¨ornyezeti v´altoz´okat is tudjunk id´ez˝ojelek k¨oz¨ott megadott sztringekben szerepeltetni: bercin@users:~$ szamlaszam=123456789 bercin@users:~$ mkdir ’A bankszamlam szama: $szamlaszam’ bercin@users:~$ ls A bankszamlam szama: $szamlaszam Ez itt egy teljes mondat bin Hallgatok Ez itt egy masik hosszu nevu konyvtar Kedves bercin@users:~$
public_html teszt ZHk
A k¨ onyvt´ arn´evben nem helyettes´ıt˝ od¨ ott be a szamlaszam k¨ornyezeti v´altoz´o ´ert´eke. Megold´as: ha a sztinget " jelek k¨ oz´e tessz¨ uk, akkor a shell a $ ´ertelmez´es´et tov´abbra is meg fogja tenni: bercin@users:~$ mkdir "A bankszamlam szama: $szamlaszam" bercin@users:~$ ls A bankszamlam szama: 123456789 Ez itt egy teljes mondat A bankszamlam szama: $szamlaszam Hallgatok bin Kedves Ez itt egy masik hosszu nevu konyvtar public_html bercin@users:~$
teszt ZHk
Term´eszetesen mag´ anak a k¨ ornyezeti v´altoz´onak is adhat´o a fenti m´odon sz´ok¨ozt (vagy egy´eb m´ as speci´ alis karaktert) tartalmaz´ o ´ert´ek: bercin@users:~$ telefonszam="+36 12 345 6789" bercin@users:~$ mkdir "A telefonszamom: $telefonszam" bercin@users:~$ ls A bankszamlam szama: 123456789 Hallgatok A bankszamlam szama: $szamlaszam Kedves A telefonszamom: +36 12 345 6789 public_html bin teszt
15
Ez itt egy masik hosszu nevu konyvtar Ez itt egy teljes mondat bercin@users:~$
ZHk
A promptot most m´ ar ´ at´ all´ıthatjuk u ´gy, hogy az sokkal szebben n´ezzen ki, mint az els˝o p´eld´aban (l´ asd a 4.3. r´eszt): bercin@users:~$ PS1="Ez az en promptom: " Ez az en promptom: echo szia szia Ez az en promptom: ls A bankszamlam szama: 123456789 Hallgatok A bankszamlam szama: $szamlaszam Kedves A telefonszamom: +36 12 345 6789 public_html bin teszt Ez itt egy masik hosszu nevu konyvtar ZHk Ez itt egy teljes mondat Ez az en promptom: A prompt be´ all´ıt´ asakor haszn´ alhatunk speci´alis ´ert´ekeket is, amiket a shell ´ertelmezni fog, ´es a megfelel˝ o ´ert´ekre cser´el. Ezek k¨ oz¨ ul a leggyakrabban haszn´altak a 2. t´abl´azatban l´athat´oak. speci´ alis karakter \u \h \H \w \W \$
karakterek, amelyek megfelelnek a mint´anak felhaszn´ al´ on´ev a g´ep neve, amire be vagyunk jelentkezve a g´ep teljes neve, amire be vagyunk jelentkezve az aktu´ alis k¨onyvt´ar teljes el´er´esi u ´ttal az aktu´ alis k¨onyvt´ar el´er´esi u ´tj´anak utols´o eleme egyszer˝ u felhaszn´al´o eset´eben $ jel, rendszergazda eset´eben # jel
2. t´ abl´ azat. Prompt be´ all´ıt´ as´ ahoz haszn´alhat´o legfontosabb speci´alis karakterek Ahogy a t´ abl´ azatb´ ol l´ atszik, a \ karakter egyes esetekben speci´alis ´ertelmez´es˝ u karakterek speci´ alis ´ertelmez´es´enek kikapcsol´ as´ ara, m´as esetekben norm´al ´ertelmez´es˝ u karakterek speci´alis ´ertelmez´es´enek bekapcsol´ as´ ara szolg´ al. Figyelem! A t´abl´azatban szerepl˝o karakterek a prompt be´ all´ıt´ as´ aban ´ertelmezettek csak a t´ abl´azat szerint! 5.2.1. p´ elda. A prompt felhaszn´ al´ o:
g´ ep: k¨ onyvt´ ar: $ -ra t¨ ort´en˝ o be´ all´ıt´ asa a k¨ ovetkez˝ o m´ odon v´egezhet˝o el: bercin@users:~$ PS1="felhaszn´ al´ o: \u g´ ep: \h k¨ onyvt´ ar: \w $ " felhaszn´ al´ o: bercin g´ ep: www-users k¨ onyvt´ ar: ~ $ echo szia szia felhaszn´ al´ o: bercin g´ ep: www-users k¨ onyvt´ ar: ~ $
´ any´ıt´ 6. Atir´ as Linuxban (UNIX-ban) minden elind´ıtott programnak az indul´askor h´arom k¨ ul¨onb¨oz˝o ki-bemeneti (I/O) csatorn´ aja l´etezik: a 0 sz´ ammal, a C nyelvben stdin-nel, a C++ nyelvben cin-nel jel¨olt sztenderd bemenet, az 1 sz´ ammal, a C nyelvben stdout-tal, a C++ nyelvben cout-tal jel¨olt sztenderd kimenet ´es a 2 sz´ ammal, a C nyelvben stderr-rel, a C++ nyelvben cerr-rel jel¨olt hiba kimenet. Ezeket a csatorn´ akat ´ at lehet ir´any´ıtani. A sztenderd kimenetet ´atir´any´ıthatjuk egy f´ ajlba a parancs ut´ an > jelet v´eg¨ ul a f´ ajl nev´et megadva:
16
bercin@users:~$ ls /bin/c* /bin/cat /bin/chgrp /bin/chown /bin/cpio /bin/chacl /bin/chmod /bin/cp bercin@users:~$ ls /bin/c* > kimenet bercin@users:~$ A > speci´ alis karakter az ls parancs kimenet´et a kimenet f´ajlba ir´any´ıtotta ´at (l´etrehozva a f´ ajlt, ha az addig nem l´etezett), emiatt nem l´atszik a parancs eredm´enye a k´eperny˝on. Egy f´ajl tartalm´ at a cat paranccsal ´ırathatjuk ki. ´Irassuk ki a kimenet f´ajl tartalm´at: bercin@users:~$ cat kimenet /bin/cat /bin/chacl /bin/chgrp /bin/chmod /bin/chown /bin/cp /bin/cpio bercin@users:~$ Egy parancs nem csak a sztenderd kimenet´ere ´ırhat ki u ¨zeneteket, hanem a hiba kimenet´en is megjelen´ıthet sz¨ oveget: ehhez a k¨ ovetkez˝o p´eld´aban a c-vel kezd˝od˝o f´ajlokat ´es a asadadads nev˝ u f´ ajlt is megpr´ ob´ aljuk kilist´ azni, de az ut´obbi nem l´etezik: bercin@users:~$ ls asadadads /bin/c* ls: cannot access asadadads: No such file or directory /bin/cat /bin/chgrp /bin/chown /bin/cpio /bin/chacl /bin/chmod /bin/cp bercin@users:~$ A hiba kimenet ´ atir´ any´ıt´ as´ ara a 2> karaktereket kell haszn´alnunk: bercin@users:~$ ls asadadads /bin/c* 2> kimenet /bin/cat /bin/chgrp /bin/chown /bin/cpio /bin/chacl /bin/chmod /bin/cp bercin@users:~$ cat kimenet ls: cannot access asadadads: No such file or directory bercin@users:~$ J´ ol l´ athat´ o, hogy a sztenderd kimenet (´atir´any´ıt´as hi´any´aban) tov´abbra is megjelent a k´eperny˝on, de a hiba¨ uzenetet m´ ar a f´ ajlban t´ aroltuk el. Ha mind a hiba, mind a sztenderd kimenetet ´at akarjuk ir´ any´ıtani, akkor az el˝ oz˝ oek term´eszetesen egym´as ut´an is alkalmazhat´ok: bercin@users:~$ ls asadadads /bin/c* > kimenet.sima 2> kimenet.hiba bercin@users:~$ cat kimenet.sima /bin/cat /bin/chacl /bin/chgrp /bin/chmod /bin/chown /bin/cp /bin/cpio bercin@users:~$ cat kimenet.hiba ls: cannot access asadadads: No such file or directory bercin@users:~$ Ha a k´et kimenetet ugyanabba a f´ ajlba akarjuk ´atir´any´ıtani akkor arra a k¨ovetkez˝o m´odszert kell haszn´ alni:
17
bercin@users:~$ ls asadadads /bin/c* > kimenet 2>&1 bercin@users:~$ cat kimenet ls: cannot access asadadads: No such file or directory /bin/cat /bin/chacl /bin/chgrp /bin/chmod /bin/chown /bin/cp /bin/cpio bercin@users:~$ A 2>&1 azt jelenti, hogy a sztenderd error kimenetet (2) ugyanoda akarjuk ´atir´any´ıtani, ahova a sztenderd kimenet (1) aktu´ alisan ir´ any´ıtva van a feldolgoz´as pillanat´aban. 6.0.1. feladat. Mi a k¨ ul¨ onbs´eg az al´ abbiak k¨oz¨ott? parancs 2>&1 > fajlnev parancs > fajlnev 2>&1 Pr´ ob´ aljuk ki, ´es ´ertelmezz¨ uk az eredm´enyt! Az el˝ oz˝ oekben a kimenetet u ´gy ir´any´ıtottuk ´at, hogy ha a f´ajl nem l´etezett, akkor azt a shell l´etrehozta, ha l´etezett, akkor t¨ or¨olte annak tartalm´at, ´es ezut´an ´ırta bele az ´atir´any´ıt´as eredm´eny´et. Ha arra van sz¨ uks´eg¨ unk, hogy a f´ajl tartalm´at ne t¨or¨olje, hanem a m´ar megl´ev˝o f´ajl v´eg´ehez ´ırja hozz´ a az ´ atir´ any´ıt´ as tartalm´at, akkor a >> karaktereket kell haszn´alni: bercin@users:~$ bercin@users:~$ /bin/cp /bin/cpio bercin@users:~$ bercin@users:~$ /bin/chacl /bin/chgrp /bin/chmod /bin/chown bercin@users:~$ bercin@users:~$ /bin/chacl /bin/chgrp /bin/chmod /bin/chown /bin/cat bercin@users:~$
ls /bin/cp* > kimenet cat kimenet
ls /bin/ch* > kimenet cat kimenet
ls /bin/ca* >> kimenet cat kimenet
18