105.1 Lecke 3
Tanúsítvány: |
LPIC-1 |
---|---|
Verzió: |
5.0 |
Témakör: |
105 Shellek és shell scriptelés |
Fejezet: |
105.1 A shell testre szabása és használata |
Lecke: |
3/3 |
Bevezetés
Miután az előző leckékben áttekintettük a shelleket, a startup scripteket és a változókat, a shell testre szabásának témáját két nagyon érdekes elemmel zárjuk le: alias és functions (függvények). Valójában a változók, az aliasok és a függvények teljes csoportja — és ezek egymásra gyakorolt hatása — alkotja a shell környezetét.
E két rugalmas és időtakarékos eszköz fő erőssége az egységbezárás koncepciójához kapcsolódik: lehetőséget nyújtanak arra, hogy egyetlen parancs segítségével ismétlődő vagy visszatérő parancsok sorozatát állítsuk össze.
Aliasok létrehozása
Az alias más parancs(ok) helyettesítő neve. Futtatható, mint egy hagyományos parancs, de helyette egy másik parancsot hajt végre az alias definíciójának megfelelően.
Az aliasok deklarálásának szintaxisa meglehetősen egyszerű. Az aliasokat az alias
kulcsszó, majd az alias hozzárendelés megírásával kell deklarálni. Az alias hozzárendelés viszont az alias névből, egy egyenlőségjelből és egy vagy több parancsból áll:
alias alias_name=command(s)
Például:
$ alias oldshell=sh
Ez a furcsa alias elindítja az eredeti sh
shell egy példányát, amikor a felhasználó beírja az oldshell
-t a terminálba:
$ oldshell $
- Az aliasok ereje abban rejlik, hogy lehetővé teszik a hosszú parancsok rövid változatainak megírását
$ alias ls='ls --color=auto'
Note
|
Az |
Hasonlóképpen, aliasokat hozhatunk létre egymáshoz kapcsolt parancsok sorozatához — a pontosvesszőt (;
) használjuk elválasztóként. Lehet például egy olyan aliasunk, amely információt ad a git
futtatható állomány helyéről és verziójáról:
$ alias git_info='which git;git --version'
Egy alias meghívásához írjuk be a nevét a terminálba:
$ git_info /usr/bin/git git version 2.7.4
Az alias
parancs listát készít a rendszerben elérhető összes aliasról:
$ alias alias git-info='which git;git --version' alias ls='ls --color=auto' alias oldshell='sh'
Az unalias
parancs eltávolítja az aliasokat. Például unalias git-info
, és láthatjuk, hogy eltűnik a listából:
$ unalias git-info $ alias alias ls='ls --color=auto' alias oldshell='sh'
Amint azt az előző leckében az alias hi='echo We salute you.'
-nál láttuk, a parancsokat idézőjelekbe kell zárnunk (akár szimpla, akár dupla), ha — az argumentumok vagy paraméterek miatt — szóközöket tartalmaznak:
$ alias greet='echo Hello world!' $ greet Hello world!
A szóközöket tartalmazó parancsok közé tartoznak az opciókat tartalmazó parancsok is:
$ alias ll='ls -al'
Most az ll
az összes fájlt — beleértve a rejtetteket (a
) — hosszú formátumban (l
) fogja felsorolni.
Aliasokban hivatkozhatunk változókra:
$ reptile=uromastyx $ alias greet='echo Hello $reptile!' $ greet Hello uromastyx!
A változó az aliason belül is hozzárendelhető:
$ alias greet='reptile=tortoise; echo Hello $reptile!' $ greet Hello tortoise!
Az aliasokat a \
segítségével védhetjük ki (escape):
$ alias where?='echo $PWD' $ where? /home/user2 $ \where? -bash: where?: command not found
Az aliasok kivédése akkor hasznos, ha az aliasnak ugyanaz a neve, mint egy hagyományos parancsnak. Ebben az esetben az alias elsőbbséget élvez az eredeti paranccsal szemben, amely azonban továbbra is elérhető, ha az aliast kivédjük.
Hasonlóképpen, egy alias-t egy másik alias-on belül is elhelyezhetünk:
$ where? /home/user2 $ alias my_home=where? $ my_home /home/user2
Ráadásul egy függvényt egy aliason belül is elhelyezhetünk, ahogy az később látható lesz.
Idézőjelek bővítése és kiértékelése az aliasokban
Amikor idézőjeleket használunk a környezeti változókkal, a szimpla idézőjelek dinamikussá teszik a bővítést:
$ alias where?='echo $PWD' $ where? /home/user2 $ cd Music $ where? /home/user2/Music
Dupla idézőjelek esetén azonban a bővítés statikusan történik:
$ alias where?="echo $PWD" $ where? /home/user2 $ cd Music $ where? /home/user2
Az aliasok perzisztanciája: startup scriptek
A változókhoz hasonlóan, ahhoz, hogy az aliasaink tartósan fennmaradjanak, inicializáló scriptekbe kell helyeznünk őket, amelyeket az indításkor lekérdezünk.
Mint már tudjuk, a felhasználók számára a ~/.bashrc
egy jó fájl a személyes aliasaik elhelyezésére. Valószínűleg néhány alias már megtalálható ott (a legtöbbjük ki van kommentelve és készen áll a használatra a vezető #
eltávolításával):
$ grep alias .bashrc # enable color support of ls and also add handy aliases alias ls='ls --color=auto' #alias dir='dir --color= #alias vdir='vdir --color= #alias grep='grep --color= #alias fgrep='fgrep --color' #alias egrep='egrep --color= # some more ls aliases #ll='ls -al' #alias la='ls -A' #alias l='ls -CF' # ~/.bash_aliases, instead of adding them here directly. if [ -f ~/.bash_aliases ]; then . ~/.bash_aliases
Ahogy az utolsó három sorban olvasható, lehetőségünk van arra, hogy saját alias-dedikált fájlunk legyen — ~/.bash_aliases
— és azt minden rendszerindításkor a .bashrc
sourceolja.
Tehát választhatjuk ezt a lehetőséget, és létrehozhatunk és feltölthetünk tartalommal egy ilyen fájlt:
########### # .bash_aliases: # a file to be populated by the user's personal aliases (and sourced by ~/.bashrc). ########### alias git_info='which git;git --version' alias greet='echo Hello world!' alias ll='ls -al' alias where?='echo $PWD'
Függvények létrehozása
Az aliasokhoz képest a függvények sokkal programozhatóbbak és rugalmasabbak, különösen, ha a Bash speciális beépített változóiban és a pozicionális paraméterekben rejlő lehetőségek teljes kihasználásáról van szó. Nagyszerűek az olyan folyamatvezérlő struktúrákkal való munkához is, mint a ciklusok vagy feltételes függvények. A függvényt olyan parancsnak tekinthetjük, amely logikát tartalmaz más parancsok blokkjain vagy gyűjteményein keresztül.
Két szintaxis függvények létrehozásához
A függvények definiálására két érvényes szintaxis létezik.
- A
function
kulcsszó használata -
Egyrészt használhatjuk a
function
kulcsszót, amelyet a függvény neve és a kapcsos zárójelek között lévő parancsok követnek:function function_name { command #1 command #2 command #3 . . . command #n }
- A
()
használata -
Másrészt elhagyhatjuk a
function
kulcsszót, és helyette két zárójelet használhatunk közvetlenül a függvény neve után:function_name() { command #1 command #2 command #3 . . . command #n }
Gyakori, hogy a függvényeket fájlokban vagy scriptekben helyezzük el. Azonban közvetlenül a parancsértelmezőbe is be lehet írni őket, minden egyes parancsot külön sorba írva — figyeljük meg a PS2
(>
) jelzést, amely a sortörés utáni új sort jelzi:
$ greet() { > greeting="Hello world!" > echo $greeting > }
Bármelyik esetről is legyen szó — és függetlenül attól, hogy milyen szintaxist választunk — , ha úgy döntünk, hogy kihagyjuk a sortörést és egy függvényt csak egy sorban írunk, a parancsokat pontosvesszővel kell elválasztani egymástól (figyeljük meg a pontosvesszőt az utolsó parancs után is):
$ greet() { greeting="Hello world!"; echo $greeting; }
A bash
nem panaszkodott, amikor megnyomtuk az Entert, így a függvényünk készen áll a meghívásra. Egy függvény meghívásához be kell írnunk a nevét a terminálba:
$ greet Hello world!
A változókhoz és aliasokhoz hasonlóan, ha azt akarjuk, hogy a függvények a rendszer újraindítása után is megmaradjanak, akkor a shell inicializáló scriptekbe kell helyeznünk őket, mint például a /etc/bash.bashrc
(globális) vagy a ~/.bashrc
(lokális).
Warning
|
Miután aliasokat vagy függvényeket adtunk hozzá bármelyik startup script fájlhoz, az ilyen fájlokat a |
Beépített speciális Bash változók
A Bourne Again Shell egy sor speciális változóval rendelkezik, amelyek különösen hasznosak a függvények és scriptek számára. Ezek azért különlegesek, mert csak hivatkozni lehet rájuk — hozzárendelni nem. Itt van egy lista a legfontosabbakról:
$?
-
Ennek a változónak a hivatkozása a legutóbbi parancsfuttatás eredményére bővül. A
0
érték sikert jelent:$ ps aux | grep bash user2 420 0.0 0.4 21156 5012 pts/0 Ss 17:10 0:00 -bash user2 640 0.0 0.0 12784 936 pts/0 S+ 18:04 0:00 grep bash $ echo $? 0
Bármi más érték, ami nem
0
, hibát jelent:user1@debian:~$ ps aux |rep bash -bash: rep: command not found user1@debian:~$ echo $? 127
$$
-
Kiterjed a shell PID-jére (process ID):
$ ps aux | grep bash user2 420 0.0 0.4 21156 5012 pts/0 Ss 17:10 0:00 -bash user2 640 0.0 0.0 12784 936 pts/0 S+ 18:04 0:00 grep bash $ echo $$ 420
$!
-
A legutóbbi háttérmunkához tartozó PID-re bővül:
$ ps aux | grep bash & [1] 663 $ user2 420 0.0 0.4 21156 5012 pts/0 Ss+ 17:10 0:00 -bash user2 663 0.0 0.0 12784 972 pts/0 S 18:08 0:00 grep bash ^C [1]+ Done ps aux | grep bash $ echo $! 663
NoteNe feledjük, hogy az és jelet (
&
) a háttérben futó folyamatok indítására használják! - A
$0
-tól$9
-ig terjedő pozicionális paraméterek -
A függvénynek (aliasnak vagy scriptnek) átadott paraméterekre vagy argumentumokra bővülnek — a
$0
a script vagy a shell nevére bővül.Hozzunk létre egy függvényt a pozicionális paraméterek bemutatására — figyeljük meg az
PS2
(>
) jelzést, amely a sortörés utáni új sorokat jelzi:$ special_vars() { > echo $0 > echo $1 > echo $2 > echo $3 }
Most meghívjuk a függvényt (
special_vars
) úgy, hogy átadunk három paramétert (debian
,ubuntu
,zorin
):$ special_vars debian ubuntu zorin -bash debian ubuntu zorin
Az elvárásnak megfelelően működik.
WarningBár a pozicionális paraméterek átadása az aliasoknak technikailag lehetséges, ez egyáltalán nem funkcionális, mivel — az aliasoknál — a pozicionális paraméterek mindig a végén kerülnek átadásra:
$ alias great_editor='echo $1 is a great text editor' $ great_editor emacs is a great text editor emacs
További beépített, speciális Bash-változók:
$#
-
A parancsnak átadott argumentumok számával bővül.
$@
,$*
-
A parancsnak átadott argumentumokkal bővülnek.
$_
-
Az utolsó paraméterre vagy a script nevére bővül (többek között; lsd.
man bash
, hogy többet megtudjunk!):
Változók a függvényekben
Természetesen függvényekben is használhatunk változókat.
Ennek bizonyítására ezúttal létrehozunk egy új üres fájlt funed
néven, és a következő függvényt helyezzük bele:
editors() { editor=emacs echo "My editor is: $editor. $editor is a fun text editor." }
Amint azt már sejthetjük, először sourceolni kell a fájlt ahhoz, hogy meg tudjuk hívni a függvényt:
$ . funed
Most már tesztelhetjük:
$ editors My editor is emacs. emacs is a fun text editor.
Mint láthatjuk, ahhoz, hogy az editors
funkció megfelelően működjön, először az editor
változót kell beállítani. Ennek a változónak a hatókörét az aktuális shell lokálisan határozza meg, és addig hivatkozhatunk rá, amíg a munkamenet tart:
$ echo $editor emacs
A helyi változókkal együtt környezeti változókat is bevonhatunk a függvényünkbe:
editors() { editor=emacs echo "The text editor of $USER is: $editor." } editors
Figyeljük meg, hogy ezúttal úgy döntöttünk, hogy a függvényt magából a fájlból hívjuk meg (editors
az utolsó sorban). Így, amikor a fájlt forrásként használjuk, a függvény is meghívásra kerül — egyszerre:
$ . funed The text editor of user2 is: emacs.
Pozicionális paraméterek a függvényekben
Valami hasonló történik a pozicionális paraméterekkel.
Átadhatjuk őket függvényeknek a fájlból vagy scriptből (figyeljük meg az utolsó sort: editors tortoise
):
editors() { editor=emacs echo "The text editor of $USER is: $editor." echo "Bash is not a $1 shell." } editors tortoise
Sourceoljuk a fájlt, hogy bizonyítsuk, működik:
$ . funed The text editor of user2 is: emacs. Bash is not a tortoise shell.
A parancssorban pedig pozicionális paramétereket is átadhatunk függvényeknek. Ennek bizonyítására megszabadulunk a fájl utolsó sorától:
editors() { editor=emacs echo "The text editor of $USER is: $editor." echo "Bash is not a $1 shell." }
Majd sourceoljuk a fájlt:
$ . funed
Végül meghívjuk a függvényt a parancssorban a $1
pozicionális paraméterként megadott tortoise
értékkel:
$ editors tortoise The text editor of user2 is: emacs. Bash is not a tortoise shell.
Függvények a scriptekben
Függvényeket leginkább Bash scriptekben találhatunk.
A funed
fájlunk scriptté alakítása (a neve funed.sh
lesz) tényleg gyerekjáték:
#!/bin/bash editors() { editor=emacs echo "The text editor of $USER is: $editor." echo "Bash is not a $1 shell." } editors tortoise
Ennyi! Csak két sort adtunk hozzá:
-
Az első sor a shebang meghatározza, hogy melyik program fogja értelmezni a scriptet:
#!/bin/bash
. Érdekes módon ez a program maga abash
. -
Az utolsó sor egyszerűen csak a függvény meghívása.
Most már csak egy dolog maradt hátra — futtathatóvá kell tennünk a scriptet:
$ chmod +x funed.sh
Már készen is áll a futtatásra:
$ ./funed.sh The text editor of user2 is: emacs. Bash is not a tortoise shell.
Note
|
A következő leckékben mindent megtudhatunk a shell scriptelésről. |
Függvény aliason belül
Ahogy már fentebb említettük, függvényeket aliasokon belül is elhelyezhetünk:
$ alias great_editor='gr8_ed() { echo $1 is a great text editor; unset -f gr8_ed; }; gr8_ed'
Ez a hosszú érték magyarázatot érdemel, daraboljuk tehát fel:
-
Először maga a függvény:
gr8_ed() { echo $1 is a great text editor; unset -f gr8_ed; }
-
A függvény utolsó parancsa —
unset -f gr8_ed
— visszavonja a függvényt, hogy az ne maradjon a jelenlegibash
munkamenetben az alias meghívása után. -
Végül, de nem utolsósorban az alias sikeres meghívásához először magát a függvényt is meg kell hívni:
gr8_ed
.
Hívjuk meg az aliast, hogy kiderüljön, működik-e:
$ great_editor emacs emacs is a great text editor
Ahogy a fenti unset -f gr8_ed
parancsban is látható, az unset
parancsot nem csak változók, hanem függvények visszavonására is használhatjuk. Valójában vannak speciális kapcsolók vagy opciók:
unset -v
-
változókhoz
unset -f
-
függvényekhez
Ha kapcsolók nélkül használjuk, az unset
először egy változót próbál visszaállítani, és — ha ez nem sikerül — akkor egy függvényt.
Függvény függvényen belül
Most tegyük fel, hogy két dolgot szeretnénk közölni a user2
-vel minden alkalommal, amikor bejelentkezik a rendszerbe:
-
Köszönni és ajánlani/dicsérni egy szövegszerkesztőt.
-
Mivel kezd sok
Matroska
videófájlt elhelyezni a$HOME/Video
mappájában, ezért figyelmeztetni is szeretnénk.
Ennek érdekében a következő két függvényt helyeztük el a /home/user2/.bashrc
állományban:
Az első függvény (check_vids
) az .mkv
fájlokat ellenőrzi és figyelmeztet:
check_vids() { ls -1 ~/Video/*.mkv > /dev/null 2>&1 if [ "$?" = "0" ];then echo -e "Ne felejtsd, nem tarolhatsz 5 videofajlnal tobbet a Video mappadban.\nThanks." else echo -e "Nincsenek videok a Video mappadban. Maximum 5-ot nyugodtan tarolhatsz.\nThanks." fi }
A check_vids
három dolgot csinál:
-
Kilistázza az
mkv
fájlokat a~/Video
mappában,a kimenetet — és az esetleges hibákat — az úgynevezett bit-bucket-be (/dev/null
) küldi. -
Az előző parancs kimeneti eredményét vizsgálja.
-
A teszt eredményétől függően két üzenet egyikét adja ki.
A második függvény az editors
függvényünk módosított változata:
editors() { editor=emacs echo "Hi, $USER!" echo "Az $editor tobb, mint egy szovegszerkeszto!" check_vids } editors
Fontos, hogy két dolgot megfigyeljünk:
-
Az
editors
utolsó parancsa meghívja acheck_vids
parancsot, így mindkét függvény láncolva lesz: Az üdvözlés, a dicséret, valamint az ellenőrzés és a figyelmeztetés egymás után hajtódik végre. -
Az
editors
maga a belépési pont a függvénysorozatba, ezért az utolsó sorban (editors
) hívjuk meg.
Jelentkezzük be user2
-ként és lássuk, működik-e:
# su - user2 Hi, user2! Az emacs tobb, mint egy szovegszerkeszto! Ne felejtsd, nem tarolhatsz 5 videofajlnal tobbet a Video mappadban. Thanks.
Gyakorló feladatok
-
Töltsük ki a táblázatot “Igen” vagy “Nem” szavakkal, az aliasok és függvények képességeinek figyelembevételével:
Funkció Aliasok? Függvények? Használhatók lokális változók
Használhatók környezeti változók
Kivédhető a
\
használatávalLehet rekurzív
Nagyon produktív, ha pozicionális paraméterekkel használjuk
-
Írjuk be a parancsot, ami a rendszerben lévő összes aliast kilistázza:
-
Írjunk egy
logg
nevű aliast, ami az összesogg
fájlt kilistázza a~/Music
mappában — soronként egyet: -
Hívjuk meg az aliast, hogy megbizonyosodjunk róla, működik-e:
-
Most módosítsuk az aliast úgy, hogy az aktuális felhasználó nevét és a felsorolás előtt egy kettőspontot is kiírjon:
-
Hívjuk meg újra, hogy megbizonyosodjunk, ez az új verzió is működik-e:
-
Listázzuk ki újra az összes aliast, hogy megnézzük, a
logg
aliasunk szerepel-e a listában: -
Töröljük az aliast:
-
Tanulmányozzuk az “Alias neve” és az “Aliasolt parancs(ok)” oszlopokat és rendeljük az aliasokat az értékeikhez:
Alias neve Aliasolt parancs(ok) Alias hozzárendelés b
bash
bash_info
which bash
+echo "$BASH_VERSION"
kernel_info
uname -r
greet
echo Hi, $USER!
computer
pc=slimbook
+echo My computer is a $pc
-
Mint
root
, írjunk egymy_fun
nevű függvényt az/etc/bash.bashrc
-be! A függvénynek köszönnie kell a felhasználónak, és meg kell mondania, hogy mi az elérési útvonala. Indítsuk el úgy, hogy a felhasználó mindkét üzenetet megkapja minden egyes bejelentkezéskor: -
Lépjünk be
user2
-ként, hogy megnézzük, működik-e: -
Írjuk meg ugyanezt a függvényt mindössze egy sorban:
-
Hívjuk meg a függvényt:
-
Vonjuk vissza (unset) a függvényt:
-
Ez a
special_vars
függvény módosított változata:$ special_vars2() { > echo $# > echo $_ > echo $1 > echo $4 > echo $6 > echo $7 > echo $_ > echo $@ > echo $? > }
Ezzel a paranccsal hívjuk meg:
$ special_vars2 crying cockles and mussels alive alive oh
Találjuk ki a kimeneteket:
Referencia Érték echo $#
echo $_
echo $1
echo $4
echo $6
echo $7
echo $_
echo $@
echo $?
-
A “Függvény a függvényben” című szekcióban található mintafüggvény (
check_vids
) alapján írjunk egycheck_music
nevű függvényt, amelyet beilleszthetünk egybash
startup scriptbe, amely elfogad pozicionális paramétereket, hogy könnyen módosíthassuk:-
az ellenőrizni kívánt fájlformátum:
ogg
-
a mappa, ahol a fájlok vannak:
~/Music
-
a tárolt fájlok típusa:
music
-
a tárolt fájlok száma:
7
-
Gondolkodtató feladatok
-
A csak olvasható függvények azok, amelyek tartalmát nem tudjuk módosítani. Végezzünk kutatást a readonly functions témakörben, és töltsük ki az alábbi táblázatot:
Függvény neve Csak olvashatóvá tétel Minden csak olvasható függvény listázása my_fun
-
Keressük meg az interneten, hogyan lehet módosítani az
PS1
-t és bármi mást, amire szükségünk lehet, hogy írjunk egyfyi
nevű függvényt (amit egy startup scriptben kell elhelyezni), amely a következő információkat adja meg a felhasználónak:-
a felhasználó neve
-
home mappa
-
a host neve
-
az operációs rendszer típusa
-
a futtatható fájlok keresési útvonala
-
levelezési mappa
-
milyen gyakran kerül ellenőrzésre a levelezés
-
hány shell mélységű az aktuális munkamenet
-
prompt (ezt úgy kell módosítani, hogy
<user>@<host-date>
szerepeljen)
-
Összefoglalás
Ebben a leckében megtanultuk:
-
Mind az aliasok, mind a függvények a shell fontos funkciói, amelyek lehetővé teszik számunkra, hogy ismétlődő kódblokkokat foglaljunk egységbe bennük.
-
Az aliasok hasznosak a hosszú és/vagy bonyolult parancsok rövidebb változatainak elkészítéséhez.
-
A függvények olyan eljárások, amelyek logikát valósítanak meg, és lehetővé teszik a feladatok automatizálását, különösen, ha scriptekben használjuk őket.
-
Az aliasok és függvények írásának szintaxisát.
-
Különböző parancsok összekapcsolását a pontosvessző (
;
) segítségével. -
Hogyan használjuk helyesen az idézőjeleket az aliasoknál.
-
Hogyan lehet az aliasokat és függvényeket állandóvá tenni.
-
Bash speciális beépített változók:
$?
,$$
,$!
, pozicionális paraméterek ($0
-$9
),$#
,$@
,$*
és$_
. -
Hogyan használjunk változókat és pozicionális paramétereket függvényekkel.
-
Hogyan használjunk függvényeket scriptekben.
-
Hogyan hívhatunk meg egy függvényt egy aliasból.
-
Hogyan hívhatunk meg egy függvényt egy másik függvényből.
-
A
bash
scriptek készítésének alapjai.
A leckében használt parancsok és kulcsszavak
alias
-
Aliasok létrehozása.
unalias
-
Aliasok eltávolítása.
cd
-
Mappaváltás.
grep
-
Mintának megfelelő sorok kiíratása.
function
-
Függvények létrehozásához való shell kulcsszó.
.
-
Fájl sourceolása.
source
-
Fájl sourceolása.
ps
-
Pillanatfelvétel a jelenlegi folyamatokról.
echo
-
Egy szöveg megjelenítése.
chmod
-
Fájl üzemmódbitjeinek módosítása, például a fájl futtathatóvá tétele.
unset
-
Változók és függvények visszavonása.
su
-
Felhasználó ID megváltoztatása vagy superuserre váltás.
Válaszok a gyakorló feladatokra
-
Töltsük ki a táblázatot “Igen” vagy “Nem” szavakkal, az aliasok és függvények képességeinek figyelembevételével:
Funkció Aliasok? Függvények? Használhatók lokális változók
Igen
Igen
Használhatók környezeti változók
Igen
Igen
Kivédhető a
\
használatávalIgen
Nem
Lehet rekurzív
Igen
Igen
Nagyon produktív, ha pozicionális paraméterekkel használjuk
Nem
Igen
-
Írjuk be a parancsot, ami a rendszerben lévő összes aliast kilistázza:
alias
-
Írjunk egy
logg
nevű aliast, ami az összesogg
fájlt kilistázza a~/Music
mappában — soronként egyet:alias logg='ls -1 ~/Music/*ogg'
-
Hívjuk meg az aliast, hogy megbizonyosodjunk róla, működik-e:
logg
-
Most módosítsuk az aliast úgy, hogy az aktuális felhasználó nevét és a felsorolás előtt egy kettőspontot is kiírjon:
alias logg='echo $USER:; ls -1 ~/Music/*ogg'
-
Hívjuk meg újra, hogy megbizonyosodjunk, ez az új verzió is működik-e:
logg
-
Listázzuk ki újra az összes aliast, hogy megnézzük, a
logg
aliasunk szerepel-e a listában:alias
-
Töröljük az aliast:
unalias logg
-
Tanulmányozzuk az “Alias neve” és az “Aliasolt parancs(ok)” oszlopokat és rendeljük az aliasokat az értékeikhez:
Alias neve Aliasolt parancs(ok) Alias hozzárendelés b
bash
alias b=bash
bash_info
which bash
+echo "$BASH_VERSION"
alias bash_info='which bash; echo "$BASH_VERSION"'
kernel_info
uname -r
alias kernel_info='uname -r'
greet
echo Hi, $USER!
alias greet='echo Hi, $USER'
computer
pc=slimbook
+echo My computer is a $pc
alias computer='pc=slimbook; echo My computer is a $pc'
NoteAz aposztrófok idézőjelekre cserélhetők.
-
Mint
root
, írjunk egymy_fun
nevű függvényt az/etc/bash.bashrc
-be! A függvénynek köszönnie kell a felhasználónak, és meg kell mondania, hogy mi az elérési útvonala. Indítsuk el úgy, hogy a felhasználó mindkét üzenetet megkapja minden egyes bejelentkezéskor:A lehetőség:
my_fun() { echo Hello, $USER! echo Your path is: $PATH } my_fun
B lehetőség:
function my_fun { echo Hello, $USER! echo Your path is: $PATH } my_fun
-
Lépjünk be
user2
-ként, hogy megnézzük, működik-e:su - user2
-
Írjuk meg ugyanezt a függvényt mindössze egy sorban:
A lehetőség:
my_fun() { echo "Hello, $USER!"; echo "Your path is: $PATH"; }
B lehetőség:
function my_fun { echo "Hello, $USER!"; echo "Your path is: $PATH"; }
-
Hívjuk meg a függvényt:
my_fun
-
Vonjuk vissza (unset) a függvényt:
unset -f my_fun
-
Ez a
special_vars
függvény módosított változata:$ special_vars2() { > echo $# > echo $_ > echo $1 > echo $4 > echo $6 > echo $7 > echo $_ > echo $@ > echo $? > }
Ezzel a paranccsal hívjuk meg:
$ special_vars2 crying cockles and mussels alive alive oh
Találjuk ki a kimeneteket:
Referencia Érték echo $#
7
echo $_
7
echo $1
crying
echo $4
mussels
echo $6
alive
echo $7
oh
echo $_
oh
echo $@
crying cockles and mussels alive alive oh
echo $?
0
-
A “Függvény a függvényben” című szekcióban található mintafüggvény (
check_vids
) alapján írjunk egycheck_music
nevű függvényt, amelyet beilleszthetünk egybash
startup scriptbe, amely elfogad pozicionális paramétereket, hogy könnyen módosíthassuk:-
az ellenőrizni kívánt fájlformátum:
ogg
-
a mappa, ahol a fájlok vannak:
~/Music
-
a tárolt fájlok típusa:
music
-
a tárolt fájlok száma:
7
check_music() { ls -1 ~/$1/*.$2 > ~/.mkv.log 2>&1 if [ "$?" = "0" ];then echo -e "Ne felejtsd, nem tarolhatsz $3 $4 fajlnal tobbet a $1 mappaban.\nThanks." else echo -e "Nincs $4 fajl az $1 mappadban. $3 fajlt nyugodtan tarolhatsz.\nThanks." fi } check_music Music ogg 7 music
-
Válaszok a gondolkodtató feladatokra
A csak olvasható függvények azok, amelyek tartalmát nem tudjuk módosítani. Végezzünk kutatást a readonly functions témakörben, és töltsük ki az alábbi táblázatot:
+
Függvény neve |
Csak olvashatóvá tétel |
Minden csak olvasható függvény listázása |
|
|
|
-
Keressük meg az interneten, hogyan lehet módosítani a
PS1
-t és bármi mást, amire szükségünk lehet, hogy írjunk egyfyi
nevű függvényt (amit egy startup scriptben kell elhelyezni), amely a következő információkat adja meg a felhasználónak:-
a felhasználó neve
-
home mappa
-
a host neve
-
az operációs rendszer típusa
-
a futtatható fájlok keresési útvonala
-
levelezési mappa
-
milyen gyakran kerül ellenőrzésre a levelezés
-
hány shell mélységű az aktuális munkamenet
-
prompt (ezt úgy kell módosítani, hogy
<user>@<host-date>
szerepeljen)fyi() { echo -e "For your Information:\n Username: $USER Home directory: $HOME Host: $HOSTNAME Operating System: $OSTYPE Path for executable files: $PATH Your mail directory is $MAIL and is searched every $MAILCHECK seconds. The current level of your shell is: $SHLVL" PS1="\u@\h-\d " } fyi
-