Niektoré znaky (tzv. metaznaky) majú v interpreteroch
príkazov (napr. v bash-i)
špeciálny význam. Medzi tieto znaky patria napríklad:
Enter príkaz vykoná.
; -- slúži ako oddeľovač jednotlivých príkazov
podobne ako nový riadok.
# -- všetko čo nasleduje za týmto znakom sa interpretuje
ako komentár.
* -- reprezentuje nula alebo viac znakov pri globovaní
v súborovom systéme.
? -- reprezentuje práve jeden ľubovoľný znak pri
globovaní
v súborovom systéme.
[] -- používajú sa pri globovaní.
{} -- používajú sa pri globovaní.
<> -- používajú sa pri presmerovaní
vstupu a výstupu bežiaceho procesu.
() -- slúžia na spúšťanie subshellov.
& -- umožňuje spúšťanie procesov na
pozadí.
| -- umožňuje zreťazené
spúšťanie procesov.
$ -- umožňuje prístup k hodnotám premenných.
" -- úvodzovky; odoberajú niektorým metaznakom
ich špeciálny význam.
' -- apostrofy; odoberajú väčšine metaznakov ich
špeciálny význam.
\ -- odoberá ostatným metaznakom ich špeciálny význam,
t.j. slúži ako tzv. escape character.
V rôznych situáciách je potrebné metaznakom odobrať ich špeciálny význam. Napríklad ak chceme vytvoriť súbor alebo adresár, ktorého názov obsahuje medzeru:
Cvičenie Zmente aktuálny adresár:
$> cd ~/os/cv02/
Cvičenie Pokúste sa vytvoriť adresár s názvom
test dira overte či sa to podarilo:
$> mkdir test dir $> ls -l drwxrwxr-x 2 user user 4096 Jun 19 11:07 dir drwxrwxr-x 2 user user 4096 Jun 19 11:07 test
V skutočnosti predchádzajúci príkaz vytvoril dva adresáre, prvý
s názvom test a druhý s názvom dir. Stalo
sa tak preto, lebo znak medzera slúži ako oddeľovač parametrov a
príkaz mkdir vie vytvoriť viacero adresárov súčasne ak bolo
zadaných viacero samostatných názvov na príkazovom riadku.
Ak chceme aby bol vytvorený jeden adresár s názvom test dir,
musíme znaku medzera medzi test a dir odobrať
význam oddeľovača. Jedným zo spôsobov ako to spraviť je použiť
tzv. escapovanie, t.j. uviesť pred špeciálnym
znakom znak \.
Cvičenie Vyskúšajte rozdiel medzi nasledujúcimi povelmi obsahujúcimi špeciálne znaky:
$> echo * dir test $> echo \* * $> echo $USER user $> echo \$USER $USER $> echo ; $> echo \; ; $> echo \ > bla bla $> echo \\ \
Cvičenie Teraz môžme opäť skúsiť vytvoriť adresár
test dira overiť či sa to podarilo:
$> mkdir test\ dir $> ls -l drwxrwxr-x 2 user user 4096 Jun 19 11:07 dir drwxrwxr-x 2 user user 4096 Jun 19 11:07 test drwxrwxr-x 2 user user 4096 Jun 19 11:18 test dir
Podobný efekt môžeme dosiahnuť použitím úvodzoviek. Páry úvodzoviek a apostrofov odoberajú špeciálny význam niektorým metaznakom vo výrazoch vo vnútri, je medzi nimi ale určitý rozdiel.
Cvičenie Vyskúšajte rozdiel medzi nasledujúcimi povelmi (sledujte najmä rozdiel medzi výrazmi ako
'$USER'a"$USER"):
$> echo * $> echo "*" $> echo "$USER" $> echo '$USER' $> echo "$$" $> echo '$$' $> echo ; $> echo ';'
![]() |
Dôležité |
|---|---|
Apostrofy zabraňujú expanzií premenných a parametrov, úvodzovky expanzií nebránia. |
Teraz môžme vyskúšať vymazať všetky tri vytvorené adresáre:
Cvičenie Zmažte adresáre
test,diratest dira overte, či sa vykonanie operácie podarilo.
$> rmdir test dir "test dir" $> ls -l
Medzi ďalšie špeciálne znaky patrí znak ` (opačný
apostrof, backtick). Výraz uzavretý v dvojici
opačných apostrofov sa interpreter najskôr pokúsi vykonať ako príkaz
a pôvodný výraz uzavretý medzi opačnými apostrofmi sa nahradí
textovým výstupom
tohto príkazu. Napriklad:
$> echo "Pracujete v adresari `pwd`, aktuálny čas je `date +%T`." Pracujete v adresari /home/user/os/cv02, aktuálny čas je 13:14:04.
Pre výrazy v opačných apostrofoch existuje aj alternatívna syntax:
$(vyraz)
![]() |
Tip |
|---|---|
Na rozdiel od dvojice opačných apostrofov, je možné výrazy |
Cvičenie Vyskúšajte si použitie vnorených výrazov
$(...).
$> echo "V nadradenom adresari su nasledujuce polozky: $(ls $(pwd)/..)." V nadradenom adresari su nasledujuce polozky: cv01 cv02 cv03 ... cv11 cv12.
![]() |
Tip |
|---|---|
Obsah súboru bez akýchkoľvek transformácií je možné získať
pomocou výrazu |
Cvičenie Vypíšte verziu jadra operačného systému zo súboru
/proc/version.
$> echo "Verzia systemu: '$(</proc/version)'" Verzia systemu: 'Linux version 2.6.32-5-amd64 ... '