Es ist wichtig zu verstehen, dass die ~
Erweiterung ein Merkmal der Shell (einiger Shells) ist. Sie ist kein magisches Zeichen, sondern bedeutet, dass Ihr Home-Verzeichnis dort ist, wo es verwendet wird.
Es wird erweitert (durch die Shell, die eine Anwendung zum Interpretieren von Befehlszeilen ist), wie $var
es unter bestimmten Bedingungen auf seinen Wert erweitert wird, wenn es in einer Shell-Befehlszeile verwendet wird, bevor der Befehl ausgeführt wird.
Dieses Feature erschien zum ersten Mal in der C-Shell in den späten 1970er Jahren (die Bourne-Shell hatte es nicht, und ihr Vorgänger die Thompson-Shell) 80er Jahre). Es wurde schließlich von POSIX standardisiert und ist jetzt in den meisten Shells verfügbar, einschließlich solcher, die nicht zu POSIX gehören fish
.
Da es in Shells so weit verbreitet ist, wird es von einigen Nicht-Shell-Anwendungen auch als Basisverzeichnis erkannt. Das ist bei vielen Anwendungen in ihren Konfigurationsdateien oder ihre eigenen Kommandozeile ( mutt
, slrn
, vim
...).
bash
speziell (die die Hülle des GNU - Projektes ist und weit verbreitet in vielen Linux-basierten Betriebssystemen verwendet wird ), wenn aufgerufen , wie sh
, vor allem die folgenden POSIX Regeln über ~
Expansion, und in Bereichen , die nicht von POSIX angegeben, verhält sich meist wie der Korn - Shell (von was es ist ein Teil Klon).
Während $var
die Erweiterung an den meisten Stellen (mit Ausnahme von einfachen Anführungszeichen) vorgenommen wird, wird die ~
Erweiterung nachträglich nur unter bestimmten Bedingungen durchgeführt.
Es wird erweitert, wenn in Listenkontexten, in Kontexten, in denen eine Zeichenfolge erwartet wird, ein eigenes Argument angegeben wird.
Hier sind einige Beispiele, in denen es erweitert wurde bash
:
cmd arg ~ other arg
var=~
var=x:~:x
(benötigt von POSIX, verwendet für Variablen wie PATH
, MANPATH
...)
for i in ~
[[ ~ = text ]]
[[ text = ~ ]]
(Die Erweiterung ~
, in AT & T als Muster verwendet zu werden, ksh
aber nicht bash
seit 4.0).
case ~ in ~) ...
${var#~}
(wenn auch nicht in anderen Schalen)
cmd foo=~
(allerdings nicht, wenn es als aufgerufen sh
wird und nur, wenn das, was links von der =
steht, wie ein nicht zitierter bash
Variablenname geformt ist. )
cmd ~/x
(wird natürlich von POSIX benötigt)
cmd ~:x
(aber nicht x:~:x
oder x-~-x
)
a[~]=foo; echo "${a[~]} $((a[~]))"
(nicht in einigen anderen Schalen)
Hier sind einige Beispiele, in denen es nicht erweitert wird:
echo "~" '~'
echo ~@ ~~
(Beachten Sie auch, dass ~u
dies zum Home-Verzeichnis des Benutzers erweitert werden soll u
).
echo @~
(( HOME == ~ ))
, $(( var + ~ ))
- mit
extglob
: case $var in @(~|other))...
(obwohl case $var in ~|other)
ist OK).
./configure --prefix=~
(da --prefix
kein gültiger Variablenname ist)
cmd "foo"=~
(in bash
, wegen der Anführungszeichen).
- wenn aufgerufen , wie
sh
: export "foo"=~
, env JAVA_HOME=~ cmd
...
Zu was es erweitert wird: ~
alleine wird zum Inhalt der HOME
Variablen oder, wenn es nicht festgelegt ist, zum Ausgangsverzeichnis des aktuellen Benutzers in der Kontodatenbank erweitert (als Erweiterung, da POSIX dieses Verhalten undefiniert lässt).
Es ist zu beachten, dass in ksh88 und bash
Versionen vor 4.0 die Tilde-Erweiterung in Listenkontexten globbing (Dateinamengenerierung) unterzogen wurde:
$ bash -c 'echo "$HOME"'
/home/***stephane***
$ bash -c 'echo ~'
/home/***stephane*** /home/stephane
$ bash -c 'echo "~"'
~
Das sollte im Normalfall kein Problem sein.
Beachten Sie, dass aufgrund der Erweiterung dieselbe Warnung gilt wie für andere Erweiterungsarten.
cd ~
Funktioniert nicht, wenn es $HOME
mit Komponenten beginnt -
oder diese enthält ..
. Also, obwohl es sehr unwahrscheinlich ist, jemals einen Unterschied zu machen, sollte man genau genommen schreiben:
cd -P -- ~
Oder auch:
case ~ in
(/*) cd -P ~;;
(*) d=~; cd -P "./$d";;
esac
(zur Deckung von Werten $HOME
wie -
, +2
...) oder einfach:
cd
(wie cd
bringt Sie in Ihr Home-Verzeichnis ohne Argumente)
Andere Shells haben fortgeschrittenere ~
Erweiterungen. Zum Beispiel zsh
haben wir in:
~4
, ~-
, ~-2
(Mit Abschluss) verwendet , um die Verzeichnisse in Ihrem Verzeichnis - Stack (die Orte , die Sie haben zu erweitern , cd
um vor).
- dynamische benannte Verzeichnisse . Sie können Ihren eigenen Mechanismus definieren, um zu entscheiden, wie
~something
erweitert wird.
~
dies$HOME
in jeder POSIX-Umgebung gleichwertig ist . aber ich könnte mich irren.