Signification de tilde dans Linux bash (pas dans le répertoire personnel)

106

Tout d'abord, je sais que ~/c'est le répertoire personnel. Le CD ~ou ~/m’amène au répertoire personnel.

Cependant, cd ~Xm'emmène dans un endroit spécial, où Xsemble être quelque chose.

En bash, si je frappe " cd ~" et que j'appuie sur l' onglet, cela montre un tas d' ~Xoptions possibles comme ~mailet ~postgreset ~ssh. Aller à ces dossiers et faire un pwdme montre que ces dossiers ne sont pas dans le répertoire de base; ils sont partout.

Ce ne sont pas des alias. J'ai vérifié. Ce ne sont pas des env.variables, sinon ils auraient besoin d'un fichier $.

Qu'est-ce que la définition de ces liens et où puis-je trouver où ils sont définis?

jbu
la source
~ X renvoie simplement le littéral "~ X" mais ~ retourne $ HOME et ~ + retourne $ PWD - ils ne sont pas spéciaux à part le fait qu'ils récupèrent les variables shell. c'est-à-dire qu'ils ne stockent pas les valeurs ou n'exécutent pas de commande pour les rechercher. Ils sont déjà définis. Avez-vous essayé ~ -? Je ne peux pas penser à une utilisation pour cela, mais encore une fois, il renvoie une variable shell $ OLDPWD
SDsolar

Réponses:

71

C'est une fonctionnalité de Bash appelée " expansion tilde ". C'est une fonction du shell, pas du système d'exploitation. Vous obtiendrez un comportement différent avec csh, par exemple.

Pour répondre à votre question sur la provenance des informations: votre répertoire personnel provient de la variable $HOME(peu importe ce que vous y stockez), tandis que les maisons des autres utilisateurs sont récupérées en temps réel à l'aide de getpwent(). Cette fonction est généralement contrôlée par NSS ; Par conséquent, les valeurs par défaut sont extraites /etc/passwd, bien qu'il puisse être configuré pour récupérer les informations à l'aide de n'importe quelle source souhaitée, telle que NIS, LDAP ou une base de données SQL.

L'expansion de Tilde est plus que la recherche de répertoire personnel. Voici un résumé:

~              $HOME
~fred          (freds home dir)

~+             $PWD       (your current working directory)
~-             $OLDPWD    (your previous directory)
~1             `dirs +1`
~2             `dirs +2`
~-1            `dirs -1`

dirset ~1, ~-1, etc., sont utilisés conjointement avec pushdet popd.

Tylerl
la source
comme note, le poisson ne supporte aucun d'entre eux sauf le tilde ordinaire (~)
pourquoi ils sont venus avec ~+? semble plutôt inutile.
cregox
3
~ + est à peu près le même que. Cependant, pour utiliser quelque chose comme ./file, il doit aller dans le système de fichiers et déterminer où. est localisé - cela prend quelques cycles. L'utilisation de ~ + enregistre le travail en renvoyant simplement le contenu de la variable shell $ PWD qui est déjà définie lorsque vous parcourez le système de fichiers.
SDsolar
32

Ce sont les répertoires personnels des utilisateurs. Essayez cd ~(your username), par exemple.

Ana Betts
la source
1
Ce ne sont pas des liens symboliques, les comptes de service n'ont pas de répertoires personnels sous / home
Ana Betts
Meilleure réponse dans mon cas. De plus, dans mon cas particulier, c'était le répertoire / dossier racine, pas le dossier personnel.
wlwl2
16

Sont-ils les répertoires personnels des utilisateurs /etc/passwd? Des services comme postgres, sendmail, apache, etc., créent des utilisateurs système qui ont des répertoires personnels comme les utilisateurs normaux.

Sean Bright
la source
2
En effet, ils sont ~ username est le répertoire personnel de l'utilisateur spécifié
Steve Weet
14

Ce sont des utilisateurs. Vérifiez votre /etc/passwd.

cd ~username vous amène au répertoire de base de cet utilisateur.

Joakim Elofsson
la source
FTW. Vote positif. TNX pour éclaircir cela. Je me demande combien de cycles et peut-être même une sous-couche sont impliqués dans celui-ci. Imaginez simplement si votre système compte 3K utilisateurs, comme chez un petit FAI. Yikes.
SDsolar
9

Sur ma machine, en raison de la façon dont je configure les choses, je fais:

cd ~             # /work1/jleffler
cd ~jleffler     # /u/jleffler

Le premier fait attention à la valeur de la variable d'environnement $HOME; J'ai délibérément configuré mon $HOMEsur un système de fichiers local au lieu d'un système de fichiers monté sur NFS. Le second lit le fichier de mot de passe (environ; NIS complique un peu les choses) et trouve que le fichier de mot de passe indique que mon répertoire personnel est /u/jleffleret change vers ce répertoire.

Le truc ennuyeux est que la plupart des logiciels se comportent comme ci-dessus (et la spécification POSIX pour le shell exige ce comportement). J'utilise un logiciel (et je n'ai pas beaucoup de choix pour l'utiliser) qui traite les informations du fichier de mots de passe comme la valeur actuelle de $ HOME, ce qui est faux.

En appliquant cela à la question - comme d'autres l'ont souligné, ` cd ~x` va dans le répertoire personnel de l'utilisateur 'x', et plus généralement, chaque fois que le développement du tilde est fait, ~xsignifie le répertoire personnel de l'utilisateur 'x' (et c'est une erreur si l'utilisateur «x» n'existe pas).


Il pourrait être intéressant de mentionner que:

cd ~-       # Change to previous directory ($OLDPWD)
cd ~+       # Change to current directory ($PWD)

Je ne peux pas trouver immédiatement une utilisation pour ' ~+', à moins que vous ne fassiez des trucs bizarres en déplaçant des liens symboliques dans le chemin menant au répertoire actuel.

Vous pouvez également faire:

cd -

Cela signifie la même chose que ~-.

Jonathan Leffler
la source
1
À propos cd ~+: vous pouvez potentiellement l'utiliser pour vérifier si un répertoire dans lequel vous vous trouvez existe toujours - même si c'est une manière assez peu orthodoxe de le faire.
professorsloth
1

Si vous utilisez, autofsl'extension peut en fait provenir de /etc/auto.home(ou similaire pour votre distribution). Par exemple, mon /etc/auto.masterressemble à:

/home2 auto.home --timeout 60

et /etc/auto.homeressemble à:

mgalgs -rw,noquota,intr space:/space/mgalgs
mgalgs
la source
0

Il est possible que vous voyiez des utilisateurs OpenDirectory / ActiveDirectory / LDAP «montés automatiquement» dans votre répertoire personnel.

Dans * nix, ~sera résolu dans votre répertoire personnel. De même, ~Xse résoudra en «utilisateur X».

Semblable au montage automatique pour les répertoires, OpenDirectory / ActiveDirectory / LDAP est utilisé dans les environnements plus grands / d'entreprise pour monter automatiquement les répertoires d'utilisateurs. Ces utilisateurs peuvent être des personnes réelles ou des comptes machine créés pour fournir diverses fonctionnalités.

Si vous tapez, ~Tabvous verrez une liste des utilisateurs sur votre machine.

JS.
la source