Expanze vlnovky
Vlnovka na začátku slova se expanduje na cestu k domovskému adresáři.
> echo ~
/home/petr
> echo ~/skripty
/home/petr/skripty
Přesněji se ~ expanduje na hodnotu proměnné HOME. Napíšeme-li za vlnovku
jméno uživatele, expanduje se na jeho domovský adresář podle /etc/passwd.
> echo ~root
/root
> echo ~neexistujici
~neexistujici
Poslední řádek ukazuje obvyklé chování: pokud se expanze nepodaří, zůstane výraz nezměněn. Stejně se chová i expanze jmen souborů.
Dvě další formy odkazují na aktuální a předchozí pracovní adresář (proměnné
PWD a OLDPWD):
> cd /var/log
> cd /tmp
> echo ~+
/tmp
> echo ~-
/var/log
Kdy se vlnovka expanduje
Expanze vlnovky proběhne pouze na začátku slova. Uprostřed se neexpanduje.
> echo /home/~
/home/~
Výjimkou jsou přiřazení do proměnné: vlnovka se expanduje i po znaku =
a po každé dvojtečce. Právě díky tomu funguje obvyklé rozšíření PATH.
> PATH=~/bin:${PATH}
> echo ${PATH}
/home/petr/bin:/sbin:/bin:[...]
Protože je expanze vlnovky až druhá v pořadí a proběhne před expanzí proměnných, nepomůže nám vlnovka uvnitř hodnoty proměnné.
> DIR='~/skripty'
> echo ${DIR}
~/skripty
> ls ${DIR}
ls: cannot access '~/skripty': No such file or directory
Vlnovku je proto nutné expandovat při přiřazení, nikoliv při použití — tedy
DIR=~/skripty bez apostrofů, nebo rovnou DIR=${HOME}/skripty. Druhá varianta
je ve skriptech spolehlivější.
Uvozovky i apostrofy expanzi vlnovky potlačí:
> echo "~"
~
To je další důvod, proč ve skriptech dávat přednost ${HOME}: ten se expanduje
i v uvozovkách, a uvozovky kolem cest chceme mít z důvodů popsaných v kapitole
Dělení slov a IFS.