Achèvement inattendu de Bash de ~ sur OS X

13

J'ai appuyé ~TabTabsur l'invite de commande bash et j'ai obtenu un ensemble de complétions inattendu.

Tout d'abord, il ressemblait à tous les gens du /Usersrépertoire, et bien plus encore.

Ensuite, j'ai pensé qu'il faisait la recherche inversée des gens avec des répertoires "home" dans /etc/password, ou peut-être ceux qui étaient /var/empty- cela semble à peu près juste.

Ce qui m'intéresse, c'est ce qui se passe vraiment et pourquoi cela fonctionne comme ça.

Walt Stoneburner
la source

Réponses:

21

Je n'ai pas de système OSX à portée de main, mais sur tous les * nixes, ~fooc'est un raccourci pour le répertoire personnel de l'utilisateur foo. Par exemple, cette commande se déplacera dans mon utilisateur $HOME( cd ~seule se déplacera dans votre répertoire personnel):

cd ~terdon

Donc, ~et Tabs'étendra à tous les noms d'utilisateurs possibles. La liste doit être la même que la liste des utilisateurs dans /etc/passwd.

Je peux confirmer que c'est exactement ce qui se passe lorsque j'essaie ceci sur ma Debian.

terdon
la source
C'est la même chose quand je l'essaye sur FreeBSD.
Jenny D
Donc, ce qui m'a jeté, c'est que je n'avais pas de répertoires dans / home pour ces utilisateurs. En fait, beaucoup ont dit / var / empty. J'ai pensé que de telles complétions se faisaient par recherche de disque, de sorte que ~ regarderait le répertoire personnel sur le disque plutôt que les entrées / etc / passwd. Parce que ~ signifie vraiment "le répertoire personnel d'un utilisateur" et non en fait un raccourci pour / home (ou / User), l'extension fait référence à / var / empty dans mon cas OS X. J'ai appris quelque chose de nouveau! Merci!
Walt Stoneburner
La réponse de @WaltStoneburner fdo ci-dessous suggère qu'OSX fait quelque chose de différent, je ne sais pas. Sous Linux, de toute façon, la création d'un répertoire dans /homen'est pas pertinente, cela ne fera pas apparaître un nouveau nom d'utilisateur. Notez également que les $ HOME de tous les utilisateurs ne sont pas dans /home(ou /Users).
terdon
@terdon - Je pense que vous l'avez cloué avec votre réponse. Sur mon compte Linux, j'ai un utilisateur dovenull qui a un répertoire faux de / inexistant, il apparaît dans la saisie semi-automatique, mais la commande cd échoue (comme prévu).
Walt Stoneburner
2

Je pensais qu'il faisait la recherche inversée des gens avec les répertoires "home" dans / etc / password.

Sur OS X, Open Directory est consulté à la place de / etc / passwd.

fd0
la source
1

Le manuel de référence de Bash dit :

Bash tente de terminer le traitement du texte comme un nom d'utilisateur (si le texte commence par «~»)

Bash utilise la getpwent fonction pour terminer.

man getpwent sur OSX dit:

Ces fonctions obtiennent des informations de opendirectoryd (8), y compris des enregistrements dans /etc/master.passwd qui sont décrits dans master.passwd (5).

Evgeny Vereshchagin
la source