Ich weiß, dass dies wahrscheinlich schon einmal gefragt wurde, aber ich konnte es mit Google nicht finden.
Gegeben
- Linux-Kernel
- Keine Konfigurationen, die $HOME ändern
- Bash
Wird ~ == $HOME
wahr sein?
Akzeptierte Antwort:
Wichtig zu verstehen ist, dass ~
Erweiterung ist ein Merkmal der Shell (einiger Shells), es ist kein magisches Zeichen, sondern bedeutet Ihr Home-Verzeichnis, wo immer es verwendet wird.
Es wird erweitert (durch die Shell, die eine Anwendung zum Interpretieren von Befehlszeilen ist), wie $var
wird unter bestimmten Bedingungen auf seinen Wert erweitert, wenn es in einer Shell-Befehlszeile verwendet wird, bevor der Befehl ausgeführt wird.
Dieses Feature tauchte erstmals in den späten 1970er Jahren in der C-Shell auf (die Bourne-Shell hatte es nicht, ebensowenig wie sein Vorgänger, die Thompson-Shell), wurde später der Korn-Shell hinzugefügt (einer neueren Shell, die auf der Bourne-Shell im 80er). Es wurde schließlich von POSIX standardisiert und ist jetzt in den meisten Shells verfügbar, einschließlich Nicht-POSIX-Shells wie fish
.
Da es in Shells so weit verbreitet ist, erkennen einige Nicht-Shell-Anwendungen es auch als Home-Verzeichnis. Das ist bei vielen Anwendungen in ihren Konfigurationsdateien oder eigenen der Fall Befehlszeile (mutt
, slrn
, vim
…).
bash
insbesondere (das die Shell des GNU-Projekts ist und in vielen Linux-basierten Betriebssystemen weit verbreitet ist), wenn es als sh
aufgerufen wird , folgt hauptsächlich den POSIX-Regeln über ~
Erweiterung und in Bereichen, die nicht von POSIX spezifiziert sind, verhält sich größtenteils wie die Korn-Shell (von der es ein Teilklon ist).
Während $var
wird an den meisten Stellen erweitert (außer in einfachen Anführungszeichen), ~
Erweiterung, die ein nachträglicher Einfall ist, wird nur unter bestimmten Bedingungen erweitert.
Es wird erweitert, wenn es in Listenkontexten als eigenes Argument verwendet wird, in Kontexten, in denen eine Zeichenkette erwartet wird.
Hier sind ein paar Beispiele dafür, wo es in bash
erweitert wird :
cmd arg ~ other arg
var=~
var=x:~:x
(erforderlich von POSIX, verwendet für Variablen wiePATH
,MANPATH
…)for i in ~
[[ ~ = text ]]
[[ text = ~ ]]
(die Erweiterung von~
wird als Muster in AT&Tksh
genommen aber nichtbash
seit 4.0).case ~ in ~) ...
${var#~}
(allerdings nicht in einigen anderen Shells)cmd foo=~
(Allerdings nicht, wenn es alssh
aufgerufen wird , und nur wenn links von=
steht hat die Form einesbash
ohne Anführungszeichen Variablenname)cmd ~/x
(erforderlich von POSIX offensichtlich)cmd ~:x
(aber nichtx:~:x
oderx-~-x
)a[~]=foo; echo "${a[~]} $((a[~]))"
(nicht in einigen anderen Shells)
Hier sind ein paar Beispiele, wo es nicht erweitert ist:
echo "~" '~'
echo [email protected] ~~
(Beachten Sie auch, dass~u
soll zum Home-Verzeichnis von Benutzeru
expandieren ).echo @~
(( HOME == ~ ))
,$(( var + ~ ))
- mit
extglob
:case $var in @(~|other))...
(obwohlcase $var in ~|other)
großschreibt ist in Ordnung). ./configure --prefix=~
(als--prefix
ist kein gültiger Variablenname)cmd "foo"=~
(inbash
, wegen der Anführungszeichen).- bei Aufruf als
sh
:export "foo"=~
,env JAVA_HOME=~ cmd
…
Zu was es erweitert wird:~
allein erweitert sich auf den Inhalt von HOME
-Variable, oder wenn sie nicht gesetzt ist, auf das Home-Verzeichnis des aktuellen Benutzers in der Account-Datenbank (als Erweiterung, da POSIX dieses Verhalten undefiniert lässt).
Zu beachten ist, dass in ksh88 und bash
Versionen vor 4.0 wurde die Tilde-Erweiterung in Listenkontexten einem Globbing (Dateinamengenerierung) unterzogen:
$ 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 die gleiche Warnung gilt wie bei anderen Arten von Erweiterungen.
cd ~
Funktioniert nicht, wenn $HOME
beginnt mit -
oder enthält ..
Komponenten. Also, auch wenn es sehr unwahrscheinlich ist, dass es jemals einen Unterschied macht, sollte man streng genommen Folgendes schreiben:
cd -P -- ~
Oder sogar:
case ~ in
(/*) cd -P ~;;
(*) d=~; cd -P "./$d";;
esac
(um die Werte von $HOME
abzudecken wie -
, +2
…) oder einfach:
cd
(als cd
bringt Sie ohne Argumente in Ihr Home-Verzeichnis)
Andere Shells haben fortgeschrittenere ~
Erweiterungen. Zum Beispiel in zsh
, haben wir:
~4
,~-
,~-2
(mit Vervollständigung) verwendet, um die Verzeichnisse in Ihrem Verzeichnisstapel zu erweitern (die Stellen, an denen Siecd
zu vorher).- dynamisch benannte Verzeichnisse . Sie können Ihren eigenen Mechanismus definieren, um zu entscheiden, wie
~something
wird ausgebaut.