103.1 Lecke 2
Tanúsítvány: |
LPIC-1 |
---|---|
Verzió: |
5.0 |
Témakör: |
103 GNU és Unix parancsok |
Fejezet: |
103.1 Munka a parancssorban |
Lecke: |
2/2 |
Bevezetés
Az operációs rendszer környezete tartalmazza azokat az alapvető eszközöket — mint például a parancssori shelleket és néha a GUI-t --, amelyekre szükségünk lesz ahhoz, hogy elvégezzünk dolgokat. De a környezet a parancsikonok és az előre beállított értékek katalógusával is rendelkezik. Itt fogjuk megtanulni, hogyan kell ezeket az értékeket felsorolni, meghívni és kezelni.
A környezeti változóink megtalálása
Hogyan azonosítjuk tehát az egyes környezeti változók aktuális értékeit? Az egyik mód az env
parancs használata:
$ env DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus XDG_RUNTIME_DIR=/run/user/1000 XAUTHORITY=/run/user/1000/gdm/Xauthority XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin GJS_DEBUG_TOPICS=JS ERROR;JS LOG [...]
Rengeteg kimenetet fogunk kapni — sokkal többet, mint amennyi a fenti részletben szerepel. De most figyeljük meg a PATH
bejegyzést, amely azokat a mappákat tartalmazza, ahol a shell (és más programok) más programokat keresnek anélkül, hogy egy teljes elérési utat kellene megadnunk. Ezzel a beállítással futtathatunk egy bináris programot a saját mappánkból, amely mondjuk az /usr/local/bin
mappában található, és úgy fog futni, mintha a fájl helyi lenne.
Váltsunk témát egy pillanatra. Az echo
parancs azt írja ki a képernyőre, amit mondunk neki. Akár hisszük, akár nem, sokszor nagyon hasznos lesz, ha a echo
szó szerint megismétel valamit.
$ echo "Szia! Hogy vagy?" Szia! Hogy vagy?
De van még valami, amit a echo
-val tehetünk. Ha megadjuk egy környezeti változó nevét — és a változó nevének $
előtaggal való kiegészítésével jelezzük, hogy ez egy változó — akkor ahelyett, hogy csak a változó nevét írná ki, a shell kibővíti azt, és megadja az értékét. Nem tudjuk biztosan, hogy a kedvenc mappánk jelenleg benne van-e az elérési útvonalban? Gyorsan ellenőrizhetjük a echo
futtatásával:
$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Új környezeti változók létrehozása
Saját egyéni változókat adhatunk hozzá a környezethez. A legegyszerűbb megoldás a =
karakter használata. A bal oldali sztring lesz az új változó neve, a jobb oldali pedig az értéke. A változó nevét most már megadhatjuk a echo
-nak, hogy kipróbáljuk, működött-e:
$ myvar=hello $ echo $myvar hello
Note
|
Vegyük észre, hogy a változó hozzárendelése során az egyenlőségjel egyik oldalán sincs szóköz! |
De vajon tényleg működött? Írjuk be a terminálba a bash
parancsot egy új shell megnyitásához! Ez az új shell pontosan úgy néz ki, mint az, amelyben az előbb voltunk, de valójában az eredeti shell (amelyet szülőnek nevezünk) gyermeke. Most ebben az új gyermek shellben próbáljuk meg az echo
-val elérni ugyanazt, mint korábban. Semmi. Mi történt?
$ bash $ echo $myvar $
Egy változó, amelyet az imént leírt módon hozunk létre, csak helyileg lesz elérhető — a közvetlen shell munkamenetben. Ha egy új shellt indítunk — vagy a munkamenetet az exit
segítségével zárjuk be — a változó nem tart velünk. Az exit
beírásával visszatérünk az eredeti szülő shellünkhöz, ami most éppen az a hely, ahol lenni szeretnénk. Ha szeretnénk, még egyszer lefuttathatjuk az echo $myvar
parancsot, csak hogy megerősítsük, hogy a változó még mindig érvényes. Most írjuk be az export myvar
parancsot, hogy a változót átadjuk a később megnyitott gyermek shelleknek. Próbáljuk ki: írjuk be a bash
-t egy új shellhez, majd az echo
-t:
$ exit $ export myvar $ bash $ echo $myvar hello
Mindez kissé ostobának tűnhet, amikor mindenféle cél nélkül hozunk létre shelleket. De annak megértése, hogy a shellváltozók hogyan terjednek a rendszerben, nagyon fontos lesz, amint komoly szkripteket kezdünk írni.
Környezeti változók törlése
Hogyan törölhetjük az összes létrehozott átmeneti változót? Az egyik módja, hogy egyszerűen bezárjuk a szülő shellt — vagy újraindítjuk a számítógépet. De vannak egyszerűbb módszerek is, ilyen például az unset
. Az unset
beírásával (a $
nélkül) a változót kitöröljük, erről az echo
-val megbizonyosodhatunk.
$ unset myvar $ echo $myvar $
Ha van egy unset
parancs, akkor biztosak lehetünk benne, hogy van hozzá egy set
parancs is. A set
önmagában történő futtatása rengeteg kimenetet fog megjeleníteni, de ez valójában nem sokban különbözik attól, amit az env
adott. Nézzük meg a kimenet első sorát, amit akkor kapunk, ha a PATH
-ra szűrünk:
$ set | grep PATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin [...]
Mi a különbség a set
és az env
között? A mi céljaink szempontjából a lényeg az, hogy a set
az összes változót és függvényt kiadja. Hadd illusztráljuk ezt: létrehozunk egy új változót mynewvar
néven, majd megerősítjük, hogy ott van:
$ mynewvar=goodbye $ echo $mynewvar goodbye
Most az env
futtatása, miközben a grep
-et használjuk a mynewvar
sztring szűrésére, nem jelenít meg semmilyen kimenetet. De a set
futtatása ugyanígy megmutatja nekünk a helyi változót.
$ env | grep mynewvar $ set | grep mynewvar mynewvar=goodbye
Quoting to Escape Special Characters
Ez most a legjobb alkalom arra, hogy megismerkedjünk a különleges karakterek problémájával. Az alfanumerikus karaktereket (a-z és 0-9) a Bash általában szó szerint értelmezi. Ha megpróbálunk létrehozni egy myfile
nevű új fájlt, akkor csak írjuk be a touch
-t, majd a myfile
-t, és a Bash tudni fogja, hogy mit kell vele kezdeni. Ha azonban különleges karaktert akarunk a fájlnévbe tenni, akkor egy kicsit több munkát kell végeznünk.
Ennek illusztrálására írjuk be a touch
parancsot, és utána a következő címet: my big file
. A probléma az, hogy a szavak között két szóköz van, amit a Bash értelmez. Bár technikailag a szóközt nem neveznénk “karakter”-nek, abban az értelemben az, mert a Bash nem szó szerint fogja olvasni. Ha listzázzuk az aktuális mappa tartalmát, ahelyett, hogy egyetlen my big file
nevű fájlt találnánk, három fájlt fogunk látni, amelyek neve my
, big
és file
. Ez azért van, mert a Bash úgy gondolta, hogy több fájlt akarunk létrehozni, amelyek nevét egy listában adjuk át:
$ touch my big file $ ls my big file
A szóközöket ugyanúgy értelmezi a rendszer, ha a három fájlt egy paranccsal töröljük (rm
):
$ rm my big file
Most próbáljuk ki a helyes módszert. Írjuk be a touch
és a fájlnév három részét, de ezúttal a nevet zárjuk idézőjelbe. Ezúttal működni fog, a mappa tartalmának listázása során egyetlen fájlt fogunk látni a megfelelő névvel.
$ touch "my big file" $ ls 'my big file'
Ugyanezt a hatást más módon is elérhetjük. Az aposztrófok például ugyanolyan jól működnek, mint a kettős idézőjelek. (Vegyük észre, hogy az aposztrófok minden karakter szó szerinti értékét megőrzik, míg a kettős idézőjelek minden karaktert megőriznek, kivéve a $
, `
, \
és bizonyos esetekben a !
karaktereket.)
$ rm 'my big file'
Ha minden speciális karaktert backslash-el kezdünk, akkor a karakter különlegessége “feloldódik” (escape), és a Bash szó szerint olvassa azt.
$ touch my\ big\ file
Gyakorló feladatok
-
Az
export
paranccsal adjunk hozzá egy új mappát az elérési útvonalhoz (újraindítás után nem marad meg)! -
Töröljük a
PATH
változót azunset
paranccsal! Próbáljunk meg futtatni egy parancsot (például asudo cat /etc/shadow
) asudo
használatával. Mi történt? Miért? (A parancsértelmezőből való kilépés visszaállítja az eredeti állapotot.)
Gondolkodtató feladatok
-
Keressük meg az interneten a különleges karakterek teljes listáját!
-
Próbáljuk ki a parancsok futtatását speciális karakterekből álló sztringek használatával, és különböző feloldó módszerekkel! Vannak különbségek a módszerek viselkedése között?
Összefoglalás
Ebben a leckében megtanultuk:
-
Hogyan azonosítsuk be a rendszer környezeti változóit.
-
Hogyan hozzunk létre saját környezeti változókat és hogyan exportáljuk azokat más shellekbe.
-
Hogyan távolítsuk el a környezeti változókat, és hogyan használjuk az
env
ésset
parancsokat. -
Hogyan oldjuk fel a speciális karaktereket, hogy a Bash szó szerint értelmezze őket.
A leckében a következő parancsokról volt szó:
echo
-
A bemeneti sztringek és változók kiírása.
env
-
A környezeti változók megértése és módosítása.
export
-
Környezeti változó átadása a gyermek shelleknek.
unset
-
A shell változók és függvények értékeinek és attribútumainak visszaállítása.
Válaszok a gyakorló feladatokra
-
Az
export
paranccsal adjunk hozzá egy új mappát az elérési útvonalhoz (újraindítás után nem marad meg)!Ideiglenesen hozzáadhatunk egy új mappát (talán a
myfiles
nevű mappát, amely a home mappában van) az elérési útvonalhoz azexport PATH="/home/yourname/myfiles:$PATH"
paranccsal. Hozzunk létre egy egyszerű szkriptet amyfiles/
mappában, tegyük futtathatóvá, és próbáljuk meg egy másik mappából futtatni. Ezek a parancsok azt feltételezik, hogy a home mappában vagyunk, amely tartalmaz egymyfiles
nevű mappát.$ touch myfiles/myscript.sh $ echo '#!/bin/bash' >> myfiles/myscript.sh $ echo 'echo Hello' >> myfiles/myscript.sh $ chmod +x myfiles/myscript.sh $ myscript.sh Hello
-
Töröljük a
PATH
változót azunset
paranccsal! Próbáljunk meg futtatni egy parancsot (például asudo cat /etc/shadow
) asudo
használatával. Mi történt? Miért? (A parancsértelmezőből való kilépés visszaállítja az eredeti állapotot.)Az
unset PATH
beírása törli az aktuális útvonal beállításokat. Egy bináris program abszolút cím nélküli meghívása sikertelen lesz. Emiatt a sudo parancs futtatása (amely maga is egy bináris program, amely a/usr/bin/sudo
mappában található) sikertelen lesz - hacsak nem adjuk meg az abszolút helyét, például így:/usr/bin/sudo /bin/cat /etc/shadow
. APATH
-t azexport
használatával vagy egyszerűen a shellből való kilépéssel állíthatjuk vissza.
Válaszok a gondolkodtató feladatokra
-
Keressük meg az interneten a különleges karakterek teljes listáját!
Itt egy lista:
& ; | * ? " ' [ ] ( ) $ < > { } # / \ ! ~
. -
Próbáljuk ki a parancsok futtatását speciális karakterekből álló sztringek használatával, és különböző feloldó módszerekkel! Vannak különbségek a módszerek viselkedése között?
A
"
karakterekkel történő feloldás megtartja a dollárjel, a backtick és a backslash speciális jelentését. A'
karakterekkel történő feloldás azonban minden karaktert szó szerint értelmez.$ echo "$mynewvar" goodbye $ echo '$mynewvar' $mynewvar