GNU/Linux >> Tutoriels Linux >  >> Linux

Est-ce que ~ est toujours égal à $home ?

Je sais que cela a probablement déjà été demandé, mais je n'ai pas pu le trouver avec Google.

Donné

  • Noyau Linux
  • Aucune configuration ne modifie $HOME
  • bash

Est-ce que ~ == $HOME être vrai ?

Réponse acceptée :

Ce qu'il est important de comprendre, c'est que ~ l'expansion est une fonctionnalité du shell (de certains shells), ce n'est pas un caractère magique qui signifie votre répertoire personnel où qu'il soit utilisé.

Il est développé (par le shell, qui est une application utilisée pour interpréter les lignes de commande), comme $var est étendu à sa valeur dans certaines conditions lorsqu'il est utilisé dans une ligne de commande shell avant l'exécution de la commande.

Cette fonctionnalité est apparue pour la première fois dans le C-shell à la fin des années 1970 (le shell Bourne ne l'avait pas, pas plus que son prédécesseur le shell Thompson), a ensuite été ajoutée au shell Korn (un nouveau shell construit sur le shell Bourne dans le années 80). Il a finalement été standardisé par POSIX et est maintenant disponible dans la plupart des shells, y compris ceux non POSIX comme fish .

Parce qu'il est si largement utilisé dans les shells, certaines applications non-shell le reconnaissent également comme signifiant le répertoire personnel. C'est le cas de nombreuses applications dans leurs fichiers de configuration ou leur propre ligne de commande (mutt , slrn , vim …).

bash spécifiquement (qui est le shell du projet GNU et largement utilisé dans de nombreux systèmes d'exploitation basés sur Linux), lorsqu'il est appelé en tant que sh , suit principalement les règles POSIX concernant ~ expansion, et dans les zones non spécifiées par POSIX, se comporte principalement comme le shell Korn (dont il est un clone partiel).

Tandis que $var est développé dans la plupart des endroits (sauf à l'intérieur des guillemets simples), ~ l'expansion, étant une réflexion après coup, n'est étendue que dans quelques conditions spécifiques.

Il est développé lorsqu'il est sur son propre argument dans des contextes de liste, dans des contextes où une chaîne est attendue.

Voici quelques exemples où il est développé dans bash :

  • cmd arg ~ other arg
  • var=~
  • var=x:~:x (requis par POSIX, utilisé pour des variables comme PATH , MANPATH …)
  • for i in ~
  • [[ ~ = text ]]
  • [[ text = ~ ]] (l'expansion de ~ étant pris comme modèle dans AT&T ksh mais pas bash depuis la 4.0).
  • case ~ in ~) ...
  • ${var#~} (mais pas dans certains autres shells)
  • cmd foo=~ (mais pas lorsqu'il est appelé en tant que sh , et seulement quand ce qui est à gauche du = a la forme d'un bash sans guillemets nom de la variable)
  • cmd ~/x (requis par POSIX évidemment)
  • cmd ~:x (mais pas x:~:x ou x-~-x )
  • a[~]=foo; echo "${a[~]} $((a[~]))" (pas dans certains autres shells)

Voici quelques exemples où il n'est pas développé :

  • echo "~" '~'
  • echo [email protected] ~~ (notez également que ~u est destiné à s'étendre au répertoire personnel de l'utilisateur u ).
  • echo @~
  • (( HOME == ~ )) , $(( var + ~ ))
  • avec extglob :case $var in @(~|other))... (bien que case $var in ~|other) est OK).
  • ./configure --prefix=~ (comme --prefix n'est pas un nom de variable valide)
  • cmd "foo"=~ (en bash , à cause des guillemets).
  • lorsqu'il est appelé en tant que sh :export "foo"=~ , env JAVA_HOME=~ cmd
Connexe :Debian - Mystérieux "incapable de résoudre l'hôte" dans dead.letter ?

Quant à ce qu'il se développe :~ seul s'étend au contenu de HOME variable, ou lorsqu'elle n'est pas définie, au répertoire personnel de l'utilisateur actuel dans la base de données des comptes (en tant qu'extension puisque POSIX laisse ce comportement indéfini).

Il convient de noter que dans ksh88 et bash versions antérieures à 4.0, l'expansion du tilde a subi un globbing (génération de nom de fichier) dans les contextes de liste :

$ bash -c 'echo "$HOME"'
/home/***stephane***
$ bash -c 'echo ~'
/home/***stephane*** /home/stephane
$ bash -c 'echo "~"'
~

Cela ne devrait pas être un problème dans les cas habituels.

Notez qu'étant donné qu'il est déplié, le même avertissement s'applique aux autres formes de dépliement.

cd ~

Ne fonctionne pas si $HOME commence par - ou contient .. Composants. Donc, même s'il est très peu probable que cela fasse une différence, à proprement parler, on devrait écrire :

cd -P -- ~

Ou encore :

case ~ in
  (/*) cd -P ~;;
  (*) d=~; cd -P "./$d";;
esac

(pour couvrir les valeurs de $HOME comme - , +2 …) ou simplement :

cd

(comme cd vous amène à votre répertoire personnel sans aucun argument)

D'autres shells ont des ~ plus avancés extensions. Par exemple, dans zsh , nous avons :

  • ~4 , ~- , ~-2 (avec complétion) utilisé pour développer les répertoires dans votre pile de répertoires (les endroits où vous avez cd à avant).
  • répertoires nommés dynamiques . Vous pouvez définir votre propre mécanisme pour décider comment ~something est en cours d'extension.

Linux
  1. Pourquoi la machine virtuelle Windows 10 affiche-t-elle toujours une utilisation du processeur à 100 % sur QEMU-KVM ?

  2. Que fait "exec {fd}/watchdog" dans Bash ?

  3. Pourquoi [a-z] correspond-il aux lettres minuscules dans Bash ?

  4. Que signifie -s et [[]] dans une condition If dans Bash ?

  5. La commande Rm dans le script Bash ne fonctionne pas avec la variable ?

Comment comparer des chaînes dans Bash

Bash Shebang

Pourquoi Ctrl + V ne colle-t-il pas dans Bash (shell Linux) ?

Que fait ce script bash ? [Tentative de piratage]

Comment bash teste-t-il 'faux'?

Que fait le -e dans un bash shebang ?