Ich weiß, dass dies wahrscheinlich schon einmal gefragt wurde, aber ich konnte es bei Google nicht finden.
Gegeben
- Linux Kernel
- Keine Konfigurationen, die $ HOME ändern
- Bash
Wird ~ == $HOME
wahr sein?
bash
shell
environment-variables
home
PythonNut
quelle
quelle
~
dies$HOME
in jeder POSIX-Umgebung gleichwertig ist . aber ich könnte mich irren.echo "~"
undecho "$HOME"
.~
oder nicht zitiert hat$HOME
. : P~
" nennt .) Jedenfalls etwas, das der Gelegenheitsleser wie ich im Hinterkopf behalten sollte.Antworten:
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 , wiesh
, 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 wiePATH
,MANPATH
...)for i in ~
[[ ~ = text ]]
[[ text = ~ ]]
(Die Erweiterung~
, in AT & T als Muster verwendet zu werden,ksh
aber nichtbash
seit 4.0).case ~ in ~) ...
${var#~}
(wenn auch nicht in anderen Schalen)cmd foo=~
(allerdings nicht, wenn es als aufgerufensh
wird und nur, wenn das, was links von der=
steht, wie ein nicht zitierterbash
Variablenname geformt ist. )cmd ~/x
(wird natürlich von POSIX benötigt)cmd ~:x
(aber nichtx:~:x
oderx-~-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 sollu
).echo @~
(( HOME == ~ ))
,$(( var + ~ ))
extglob
:case $var in @(~|other))...
(obwohlcase $var in ~|other)
ist OK)../configure --prefix=~
(da--prefix
kein gültiger Variablenname ist)cmd "foo"=~
(inbash
, wegen der Anführungszeichen).sh
:export "foo"=~
,env JAVA_HOME=~ cmd
...Zu was es erweitert wird:
~
alleine wird zum Inhalt derHOME
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:Das sollte im Normalfall kein Problem sein.
Beachten Sie, dass aufgrund der Erweiterung dieselbe Warnung gilt wie für andere Erweiterungsarten.
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:Oder auch:
(zur Deckung von Werten
$HOME
wie-
,+2
...) oder einfach:(wie
cd
bringt Sie in Ihr Home-Verzeichnis ohne Argumente)Andere Shells haben fortgeschrittenere
~
Erweiterungen. Zum Beispielzsh
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).~something
erweitert wird.quelle
In jeder Version von Bash auf jedem System, ja .
~
als eigenständiger Begriff wird definiert, um zu erweitern:es wird also immer dasselbe sein, wie
$HOME
es für die aktuelle Shell ist. Es gibt mehrere andere Tilde-Erweiterungen, z. B.~user
füruser
das Basisverzeichnis~
von , aber eine einzelne Erweiterung ohne Anführungszeichen wird immer auf erweitert"$HOME"
.Beachten Sie, dass das Verhalten von
~
und$HOME
in einigen Fällen unterschiedlich sein kann: Insbesondere, wenn$HOME
Leerzeichen (oder andere IFS- Zeichen) enthalten sind, wird$HOME
(ohne Anführungszeichen) auf mehrere Wörter erweitert, wobei~
es sich immer um ein einzelnes Wort handelt.~
expandiert gleichwertig zu"$HOME"
(zitiert).In Bezug auf Ihre spezifische Frage:
ist immer wahr, weil
[[
die Wortteilung unterdrückt .[[ ~ == $HOME ]
kann nicht sein, wennHOME
es Mustervergleichszeichen enthält , aber[[ ~ == "$HOME" ]]
(dh in Anführungszeichen gesetzt"$HOME"
) ist immer wahr. Die Verwendung in einzelnen Klammern kann ein Syntaxfehler für Werte sein,HOME
die Leerzeichen oder Sonderzeichen enthalten. Für jede vernünftige Heimverzeichniskonfiguration~
und"$HOME"
sind die gleichen und vergleichen Sie als gleich.Stéphane Chazelas hat in den Kommentaren einen Fall vermerkt, in dem
~
und$HOME
geben Sie unterschiedliche Werte: Wenn Sieunset HOME
, wenn Sie~
Bash verwendengetpwuid
, einen Wert aus der Kennwortdatenbank lesen wird. Dieser Fall wird von Ihrer Bedingung ausgeschlossen, dass sich die Konfiguration nicht ändert$HOME
. Der Vollständigkeit halber werde ich hier darauf hinweisen.quelle
/bin/sh
könnte nicht seinbash
. Ich bin nicht sicher, dass Posix-sh
Spezifikation erzählt~
~
.~
war nicht in der Thomson oder Bourne Shell (die zu ihrer Zeit als verfügbar waren/bin/sh
). Es ist nicht inrc
oder seine Ableitungen (wo es für etwas anderes verwendet wird)bash
, wennHOME
nicht festgelegt, wird das Basisverzeichnis~
des Benutzers aus der passwd-Datenbank erweitert. Das ist also ein Fall, in dem~
möglicherweise nicht der Wert von erweitert wird$HOME
.bash
Bash4 vor dem Ausführen des Globbing bei der Tilde-Erweiterung (tryHOME='/*' bash -c 'echo /*'
) verwendet wurde. SoHOME=/*; [ "$HOME" = ~ ]
zurückkehren würde es einen Fehler.get_current_user_info
, die verwendetgetpwuid
auf allen Plattformen aber Tandem .