$HOME
und ~
beziehen sich normalerweise auf die gleiche Sache. Das heißt, sie sind der Pfad zum Home-Verzeichnis des Benutzers, das die allgemeine Form "/ home / userName" hat.
Wann, wenn überhaupt, beziehen sich diese nicht auf dasselbe Verzeichnis?
home-directory
H2ONaCl
quelle
quelle
~
ist shellabhängig, $ HOME nicht.Antworten:
Beide
$HOME
und~
zeigen auf denselben Ordner, den Basisordner des aktuellen Benutzers, aber beide sind sehr unterschiedlich.$HOME
ist eine Umgebungsvariable , die den Basisordner des aktuellen Benutzers enthält.~
ist ein Shell-Erweiterungssymbol , dh eines der Symbole, die verarbeitet werden, bevor der eigentliche Befehl ausgeführt wird.~
Alleine wird auf den Wert von $ HOME erweitert.~nemo
wird zum Home-Verzeichnis des Benutzers erweitertnemo
. Ein Shell-Erweiterungssymbol ist ein Zeichen (oder ein Zeichenpaar), das von der Shell verarbeitet / interpretiert wird, um den eigentlichen Befehl zu erstellen. Ein weiteres Beispiel für ein Shell-Erweiterungssymbol ist*
, das zum Erweitern von Dateinamen verwendet wird.quelle
~
wird unter Windows auf $ HOME oder% APPDATA% erweitert. Wenn sie nicht definiert sind, wird nach dem Pfad in der "Kennwortdatenbank" gesucht (was normalerweise bedeutet/etc/passwd
, aber möglicherweise LDAP oder eine andere Datenquelle ist). Vor ungefähr 20 Jahren hätte man Sie warnen können, dass $ HOME auf einigen Rechnern möglicherweise nicht gesetzt ist, während~
es garantiert auf etwas erweitert wurde.~
erweitert sich auf$HOME
(gleich$HOMEPATH
), nicht$APPDATA
. Und auf cmd.exe,~
nicht erweitert.HOME
ist eine Umgebungsvariable (ein O Konzept, in sh Schalen zum Beispiel Set mitexport
oderdeclare -x
), nicht einem Shell - Variable (Definition, welche ausschließlich auf Schale abhängt, sondern in sh Schalen wird in der Regel mit eingestelltfoo=value
oder mitset
oder in einigen anderen Wege).Ein Unterschied besteht darin, wie die Bash-Shell sie konvertiert, wenn sie in
"
Anführungszeichen eingeschlossen sind.Wenn Sie
echo
wie folgt verwenden, ohne Anführungszeichen, dann~
und$HOME
haben den gleichen Effekt:Mit
"
Anführungszeichen unterscheidet sich das Ergebnis jedoch:quelle
~
Erweitert sich nur als Teil eines Tilde-Präfixes, das per Definition am Wortanfang beginnen muss. Da es früher Teil von Globbing-Mustern war,~
funktioniert es auch nicht in doppelten Anführungszeichen. Also,"~"
odera~b
wird zu einem wörtlichen Wert der~
Erhaltung führen.Ein einzelnes
~
(oder ein~
gefolgt von einem/
) wird zum Haus des aktuellen Benutzers erweitert:Ein
~
gefolgt von einem Benutzernamen wird zum Basisordner dieses Benutzers erweitert:Ein
~
gefolgt von einem+
oder einem-
und einer optionalen Zahl wird zu Elementen des Verzeichnisstapels erweitert :$HOME
ist das Äquivalent einer einzelnen~
Variable, die stattdessen den Syntaxregeln für Variablen folgt. Beispielsweise wird es in doppelten Anführungszeichen erweitert, kann deaktiviert werden und Zeichenfolgenmanipulationsoperanden können darauf angewendet werden.quelle
Das hängt sehr davon ab, was die Erweiterung bewirkt. In bash
~
ist dies eine bequeme Methode, um das Basisverzeichnis abzurufen, ohne die Dateinamenerweiterung oder die Wortteilung auszulösen, obwohl es nicht in Anführungszeichen gesetzt ist. Beispielsweise:Oder:
Wenn Sie also aus irgendeinem Grund mit Zitaten ringen (in diesem Fall sollten Sie das Ganze wirklich überdenken, es ist einfacher, mit Schweinen zu ringen), ist dies
~
möglicherweise praktischer.An anderer Stelle, zum Beispiel in Python,
~
und$HOME
müssen um verschiedene Funktionen erweitert werden . Einige andere Stellen erlauben Variablen und erlauben keine andere Shell-Syntax wie Platzhalter oder Tilde-Erweiterung (z. B.~/.pam_environment
eine spezielle Syntax für die Variablenerweiterung). Wieder andere Stellen erlauben eine Tilde-Erweiterung als Ausnahme (z. B. systemd ), fragen jedoch die passwd-Datenbank direkt ab, anstatt sie zu verwenden$HOME
.quelle
$HOME
, aber Sie können den Wert von nicht (direkt) ändern~
.$HOME
und wann~
nicht - normalerweise standardmäßig - und Sie haben der Umgebungsvariablen absichtlich zugewiesen, damit sie nicht auf dasselbe verweisen. Dies ist eine gute Demonstration, aber unnötig verwirrend.Es ist wahrscheinlicher, dass $ HOME / in POSIX.2 Bourne / bin / sh funktioniert, da die Tilde-Erweiterung eine Erweiterung von BSD csh tcsh GNU bash und anderen ist.
Wenn Sie Skripte schreiben möchten, die auf busybox oder dash oder BSD sh portierbar sind, investieren Sie in die zusätzlichen Buchstaben, damit Sie nicht mit ~ /: Keine solche Datei oder Verzeichnis auf bestimmten Systemen abstürzen.
Ich finde auch $ HOME / lesbarer.
quelle
$HOME
nur selten verwendet~
. Mein früheres Ich wusste das wahrscheinlich.