Vyhodnocení příkazů
Obsah |
Vyhodnocování příkazového řádku v shellu
- Proměnné a další speciální znaky v Linuxu nahrazuje shell. Příkazy tedy tyto znaky vůbec nedostanou.
Pokud například zapíšeme v příkazovém řádku:
mv *.txt ~/$TARGET
Shell provede následující nahrazení:
-
~
nahradí za domovský adresář -
$TARGET
nahradí za obsah proměnné -
*.txt
nahradí za seznam všech souborů v adresáři s příponou .txt.
Pokud příkaz spustí uživatel student
, obsahem proměnné TARGET
je text backup
a v aktuálním adresáři mají příponu .txt jen soubory a.txt
a b.txt
, spustí se příkaz:
mv a.txt b.txt /home/student/backup
Ve Windows metaznaky dostávají příkazy bez nahrazování. Proto lze na Windows psát:
ren *.jpg *.bkp.jpg
V Linuxu bychom toto museli řešit s využitím cyklu.
- Pořadí nahrazování
- ~
- nahrazení proměnných
- nahrazení *, ?
Nahrazené hodnoty se dále nenahrazují
Jednou nahrazené hodnoty již dalším nahrazováním neprochází, i když obsahují speciální znaky
Příklady:
FILES="*.txt" ls $FILES
→ vypíše: ls: nelze přistoupit k '*.txt'
A ze stejného důvodu:
touch '$POKUS' echo *POK*
→ vypíše: $POKUS
(Nedosadí se hodnota proměnné POKUS.)
A také:
TARGET="~/BACKUP" cp data.txt $TARGET
→ vypíše chybu a nebude fungovat, protože se bude snažit zapisovat do složky ~/BACKUP
(vlnovka a lomítko budou součástí názvu)
Přitom ale:
TARGET=~/BACKUP cp data.txt $TARGET
→ fungovat bude (pokud existuje složka BACKUP
ve vaší domovské složce)
Vložení speciálních znaků do příkazů
- Pokud chceme do textu vložit speciální znaky, můžeme použít zpětné lomítko, uvozovky nebo apostrofy (
\
,"
nebo'
). - Zpětné lomítko
\
: ruší speciální význam dalšího znaku. - Uvozovky
"
: blokují význam speciálních znaků, ale doplňují se hodnoty proměnných. - Apostrofy
'
: blokují význam všech speciálních znaků včetně$
.
-
student@computer:~$ touch \$USER
→ Vytvoří soubor s názvem$USER
-
student@computer:~$ touch a\ b
→ Vytvoří soubor s názvema b
(v názvu je mezera) -
student@computer:~$ touch a\\b
→ Vytvoří soubor s názvema\b
-
student@computer:~$ echo ~/$USER
→ /home/student/student -
student@computer:~$ echo "~/$USER"
→ ~/student -
student@computer:~$ echo '~/$USER'
→ ~/$USER
Obecně nedoporučujeme používat v názvech souborů speciální znaky!
Může se ale stát, že takový soubor vznikne například přenosem z jiného operačního systému, kde dané znaky nejsou speciálními znaky.