Die Bash-Shell bietet einige Variablen mit vorangestelltem '~' (namens Tilde), die als Tilde-Erweiterungen bezeichnet werden.
Sie sind Synonyme für den Inhalt anderer Variablen in Ihrer Shell.
Tilde-Erweiterung ist der Prozess der Umwandlung dieser Abkürzungen in die Verzeichnisnamen, für die sie stehen. Lassen Sie uns in diesem Artikel die Tilde-Erweiterungsfunktion anhand von Beispielen überprüfen.
Die Tilde-Erweiterung gilt für die „~“-Pluszeichen, einschließlich +, – und N (das eine ganze Zahl ist) bis hin zu Leerzeichen oder einem Schrägstrich .
Die Tilde-Erweiterung wird verwendet, um auf mehrere spezifische Pfadnamen zu erweitern:
- Home-Verzeichnisse
- Aktuelles/vorheriges Arbeitsverzeichnis
- Verzeichnisse vom Verzeichnisstapel.
Home-Verzeichnisse
Die Tilde-Erweiterung bietet eine Möglichkeit, das Home-Verzeichnis des aktuellen Benutzers oder das Home-Verzeichnis des angegebenen Benutzernamens zu erweitern.
Syntax ~ Expand to the variable $HOME or home directory of the current user ~USER Expand to the home directory of the given username
Beispiel 1. Aktuelle Benutzer-Startseite
Tilde(~) als separates Wort wird zu $HOME erweitert, wenn es definiert ist, wenn $HOME nicht definiert ist, wird es mit dem Home-Verzeichnis des aktuellen Benutzers erweitert.
Jetzt ist der Wert der HOME-Variable /home/oracle, also änderte cd ~ das aktuelle Verzeichnis auf den Wert von $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 wird in /sbin geändert, und cd ~ verwendet nur $HOME, nicht das Home-Verzeichnis des Benutzers. Nachdem der Wert von $HOME zurückgesetzt wurde, änderte cd ~ das Verzeichnis auf den Wert des Home-Verzeichnisses, das für den Oracle-Benutzer in /etc/passwd festgelegt wurde. Für die Tilde-Erweiterung überschreibt HOME das echte Home-Verzeichnis.
[~]$ export HOME=/sbin [oracle]$ cd ~ [~]$ pwd /sbin [~]$ unset HOME [sbin]$ cd ~ [oracle]$ pwd /home/oracle
Beispiel 2. Heimatverzeichnis des angegebenen Benutzers
Das folgende Skript übernimmt die Sicherung einer Protokolldatei, die das aktuelle Datum im Namen hat. Es protokolliert auch die Start- und Endzeit in der Datei namens backup.log im Home-Verzeichnis des Oracle-Benutzers.
#! /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
Wenn der angegebene Benutzername nicht existiert, wird er nicht erweitert. Im folgenden Beispiel gibt es keinen Benutzer namens ora. Daher wird ~ora nicht nach /home/ora erweitert.
$ echo ~ora ~ora
Lesen Sie unseren früheren Artikel, um zu verstehen, wie man Klammererweiterungen in bash durchführt. d.h. wie man { } in Bash verwendet.
Arbeitsverzeichnisse
Tilde mit + und – werden zur Darstellung der Arbeitsverzeichnisse verwendet.
- ~+ wird auf den Wert der PWD-Variablen erweitert, die das aktuelle Arbeitsverzeichnis enthält.
- ~- wird auf den Wert der OLDPWD-Variablen erweitert, die das vorherige Arbeitsverzeichnis enthält. Wenn OLDPWD nicht gesetzt ist, wird ~- nicht erweitert.
Beispiel 3. Erweiterung alter/aktueller Arbeitsverzeichnisse
Das folgende Beispiel vergleicht die Datei im aktuellen Verzeichnis und im vorherigen Arbeitsverzeichnis.
$ 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 $
In obiger Ausführung:
- ~+/gg.c erweitert sich zu /var/opt1/gg/gg.c
- ~-/gg.c erweitert sich zu /var/opt/gg/gg.c
Dieser Artikel ist Teil der fortlaufenden Bash-Tutorial-Reihe.
Erweiterung für Verzeichnisse im Stack
Jeder Bash-Prozess enthält ein Stack-Objekt, das verwendet werden kann, um Verzeichnisse zu verfolgen, die ein Skript besucht hat, während es Daten von Verzeichnisinhalten verarbeitet.
Es ist ein sehr einfacher Mechanismus, Verzeichnisse zu referenzieren oder zu zuvor besuchten Verzeichnissen zurückzuwechseln. Die Tilde-Erweiterung bietet auch eine Erweiterung der Verzeichnisse im Verzeichnisstapel.
- ~+N Erweitert das N-te Verzeichnis im Verzeichnisstapel (gezählt von links in der Liste, die von dirs ausgegeben wird, wenn es ohne Optionen aufgerufen wird), beginnend mit Null.
- ~-N Erweitert das N-te Verzeichnis im Verzeichnisstapel (gezählt von rechts von der Liste, die von dirs ausgegeben wird, wenn es ohne Optionen aufgerufen wird), beginnend mit Null.
Sehen Sie sich unseren früheren Artikel an, um zu verstehen, wie die Befehle dirs, pushd und popd verwendet werden, um den Verzeichnisstapel zu manipulieren.
Beispiel 4. Zeigt das N-te Verzeichnis von links mit ~+
anIm folgenden Beispiel hat der Verzeichnisstapel 4 Verzeichnisse. ~+2 gibt Ihnen den verfügbaren Verzeichnispfad an der zweiten Position von links, beginnend mit Null.
$ dirs -v 0 /sbin 1 /var/opt/midas 2 /var/opt/GG/bin 3 /root $ cd ~+2 $ pwd /var/opt/GG/bin
Aber oben auf dem Stapel (Nullposition) wird immer das aktuelle Verzeichnis haben. Nach der obigen Ausführung wird also Folgendes im Verzeichnisstapel angezeigt.
$ dirs -v 0 /var/opt/GG/bin 1 /var/opt/midas 2 /var/opt/GG/bin 3 /root
Beispiel 5. Zeigt das N-te Verzeichnis von rechts mit ~-
anDas Folgende ähnelt dem obigen Beispiel. Aber wegen der ~-.
werden die Verzeichnisse vom Ende des Stacks berücksichtigt$ 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