Shell Bash poskytuje některé proměnné, které mají předponu '~' (pojmenovaný tilde), které se říká Tilde Expansions.
Jsou to synonyma pro obsah jiných proměnných ve vašem shellu.
Expanze tildy je proces převodu těchto zkratek na názvy adresářů, které představují. V tomto článku se podíváme na funkci rozšíření vlnovky s příklady.
Rozšíření vlnovky se vztahuje na znaky '~' plus zahrnuje +, – a N (což je celé číslo) až po mezery nebo lomítko .
Rozšíření vlnovky se používá k rozšíření na několik konkrétních cest:
- Domovské adresáře
- Aktuální/předchozí pracovní adresář
- Adresáře ze zásobníku adresářů.
Domovské adresáře
Rozšíření vlnovky poskytuje způsob, jak rozšířit domovský adresář aktuálního uživatele nebo domovský adresář daného uživatelského jména.
Syntax ~ Expand to the variable $HOME or home directory of the current user ~USER Expand to the home directory of the given username
Příklad 1. Domovská stránka současných uživatelů
Tilda(~) jako samostatné slovo se rozšíří na $HOME, pokud je definováno, pokud $HOME není definováno, pak se rozšíří o domovský adresář aktuálního uživatele.
Nyní je hodnota proměnné HOME /home/oracle, takže cd ~ změnil aktuální adresář na hodnotu $HOME.
## Logging into a oracle user, whose home directory is /home/oracle # su oracle [tmp]$ pwd /tmp [tmp]$ echo $HOME /home/oracle [tmp]$ cd ~ [~]$ pwd /home/oracle
HOME se změní na /sbin a cd ~ používá pouze $HOME, nikoli domovský adresář uživatele. Po zrušení nastavení hodnoty $HOME, cd ~ změnil adresář na hodnotu domovského adresáře nastaveného pro uživatele oracle v /etc/passwd. U rozšíření Tilde přepíše HOME skutečný domovský adresář.
[~]$ export HOME=/sbin [oracle]$ cd ~ [~]$ pwd /sbin [~]$ unset HOME [sbin]$ cd ~ [oracle]$ pwd /home/oracle
Příklad 2. Domovský adresář daného uživatele
Následující skript provede zálohu souboru protokolu, který má v názvu aktuální datum. Zaznamenává také počáteční a koncový čas do souboru s názvem backup.log v domovském adresáři uživatele oracle.
#! /bin/bash echo "Initiating the backup at `date`" >> ~oracle/backup.log da=`date +%F` cp $da.log{,.bak} echo "END BACKUP at `date`" >> ~oracle/backup.log $ ls -l /home/oracle/ total 8 -rw-r--r-- 1 root root 99 Jun 4 14:23 backup.log
Pokud dané uživatelské jméno neexistuje, pak se na nic nerozbalí. V následujícím příkladu není žádný uživatel s názvem ora. Takže ~ora se nerozšíří na /home/ora.
$ echo ~ora ~ora
V našem dřívějším článku se dozvíte, jak provést expanzi výztuhy v bash. tj. jak používat { } v bash.
Pracovní adresáře
Vlnovka s + a – se používají pro reprezentaci pracovních adresářů.
- ~+ se rozšíří na hodnotu proměnné PWD, která obsahuje aktuální pracovní adresář.
- ~- expanduje na hodnotu proměnné OLDPWD, která obsahuje předchozí pracovní adresář. Pokud není OLDPWD nastaveno, ~- se nerozbalí.
Příklad 3. Rozšíření starých/aktuálních pracovních adresářů
Následující příklad porovná soubor v aktuálním adresáři a předchozím pracovním adresáři.
$ cat comp.sh #! /bin/bash set -x cd /var/opt/gg if [ -f gg.c ] then echo "File1 exists" fi cd /var/opt1/gg if [ -f gg.c ] then echo "File2 exists" cmp ~+/gg.c ~-/gg.c fi $ ./comp.sh + cd /var/opt/gg + '[' -f gg.c ']' + echo 'File1 exists' File1 exists + cd /var/opt1/gg + '[' -f gg.c ']' + echo 'File2 exists' File2 exists + cmp /var/opt1/gg/gg.c /var/opt/gg/gg.c cmp: EOF on /var/opt1/gg/gg.c $
Ve výše uvedeném provedení:
- ~+/gg.c se nahradí na /var/opt1/gg/gg.c
- ~-/gg.c se nahradí na /var/opt/gg/gg.c
Tento článek je součástí probíhající série Bash Tutorial.
Rozšíření pro adresáře v zásobníku
Každý bash proces obsahuje objekt zásobníku, který lze použít ke sledování adresářů, které skript navštívil, zatímco zpracovává data obsahu adresáře.
Je to velmi jednoduchý mechanismus umožňující odkazovat na adresáře nebo se vrátit zpět do adresářů, které jste předtím navštívili. Expanze tildy také poskytuje rozšíření do adresářů v zásobníku adresářů.
- ~+N Rozbalí N-tý adresář v zásobníku adresářů (počítá se zleva od seznamu vytištěného dirs při vyvolání bez možností), počínaje nulou.
- ~-N Rozbalí N-tý adresář v zásobníku adresářů (počítá se zprava od seznamu vytištěného dirs při vyvolání bez možností), počínaje nulou.
Přečtěte si náš dřívější článek, abyste pochopili, jak používat příkazy dirs, pushd a popd k manipulaci se zásobníkem adresářů.
Příklad 4. Zobrazí N-tý adresář zleva pomocí ~+
V následujícím příkladu má zásobník adresářů 4 adresáře. ~+2 vám dává dostupnou cestu k adresáři na druhé pozici zleva začínající nulou.
$ dirs -v 0 /sbin 1 /var/opt/midas 2 /var/opt/GG/bin 3 /root $ cd ~+2 $ pwd /var/opt/GG/bin
Ale horní část zásobníku (nulová pozice) bude mít vždy aktuální adresář. Takže po provedení výše se v zásobníku adresářů zobrazí následující.
$ dirs -v 0 /var/opt/GG/bin 1 /var/opt/midas 2 /var/opt/GG/bin 3 /root
Příklad 5. Zobrazí N-tý adresář zprava pomocí ~-
Následuje podobný příklad jako výše. Ale vezme v úvahu adresáře ze spodní části zásobníku kvůli ~-.
$ dirs -v 0 /var/opt/GG/bin 1 /var/opt/midas 2 /var/opt/GG/bin 3 /root $ cd ~-2 $ pwd /var/opt/midas $ dirs -v 0 /var/opt/midas 1 /var/opt/midas 2 /var/opt/GG/bin 3 /root