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 dir
a 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 dir
a 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
,dir
atest dir
a 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 ... '