GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Ist ~ immer gleich $home?

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 wie PATH , MANPATH …)
  • for i in ~
  • [[ ~ = text ]]
  • [[ text = ~ ]] (die Erweiterung von ~ wird als Muster in AT&T ksh genommen aber nicht bash seit 4.0).
  • case ~ in ~) ...
  • ${var#~} (allerdings nicht in einigen anderen Shells)
  • cmd foo=~ (Allerdings nicht, wenn es als sh aufgerufen wird , und nur wenn links von = steht hat die Form eines bash ohne Anführungszeichen Variablenname)
  • cmd ~/x (erforderlich von POSIX offensichtlich)
  • cmd ~:x (aber nicht x:~:x oder x-~-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 Benutzer u expandieren ).
  • echo @~
  • (( HOME == ~ )) , $(( var + ~ ))
  • mit extglob :case $var in @(~|other))... (obwohl case $var in ~|other) großschreibt ist in Ordnung).
  • ./configure --prefix=~ (als --prefix ist kein gültiger Variablenname)
  • cmd "foo"=~ (in bash , wegen der Anführungszeichen).
  • bei Aufruf als sh :export "foo"=~ , env JAVA_HOME=~ cmd
Siehe auch:Debian – Mysteriöser „Host kann nicht aufgelöst werden“ in dead.letter?

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 Sie cd zu vorher).
  • dynamisch benannte Verzeichnisse . Sie können Ihren eigenen Mechanismus definieren, um zu entscheiden, wie ~something wird ausgebaut.

Linux
  1. Was macht „exec {fd}/watchdog“ in Bash?

  2. Was bedeuten -s und [[]] in einer if-Bedingung in Bash?

  3. Was bedeutet set -e in einem Bash-Skript?

  4. Der Musterabgleich funktioniert nicht im Bash-Skript

  5. Warum fügt Strg + V nicht in Bash (Linux-Shell) ein?

So vergleichen Sie Zeichenfolgen in Bash

Bash Shebang

Wie funktioniert cat << EOF in Bash?

Was macht 'bash -c'?

Die Docker-Bash-Eingabeaufforderung zeigt keine Farbausgabe an

Was macht das -e in einem Bash-Shebang?