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.

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.


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.


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).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.