Modifier: Il s'agit d'un doublon de /programming/998626/meaning-of-tilde-in-linux-bash-not-home-directory/ . Je n'ai pas la réputation de fermer cette question en double.
Je ne fais pas référence à ~
comme dans le répertoire personnel mais plutôt à ceci:
$ ls ~foo/bar
/some/mount/point/foo/bar
Cependant, si je le tente avec un point de montage différent, par exemple:
$ mount | ag "/dev "
devfs on /dev (devfs, local, nobrowse)
$ ls /dev/stdin
/dev/stdin
$ ls ~stdin
zsh: no such user or named directory: stdin .
# bash has a similar error message:
ls: ~stdin: No such file or directory
Comment ~
s'appelle dans ce contexte? Comment ça marche?
Modifier: Plus d'informations basées sur certains des commentaires ci-dessous:
- Je peux attester que ce
foo
n'est pas un nom d'utilisateur sur mon système. - Lors de la tentative de saisie semi-automatique,
ls -lah ~
toutes les options ne sont pas affichées. c'est-à-dire que je peuxcd ~qux
, quandqux
n'apparaît pas dans la saisie semi-automatique. Encorequx
une fois, ce n'est pas un utilisateur dans mon système. - Si c'est important,
/some/mount/point
c'est un partage réseau. - Tous les détails suggèrent un muckery de chemin nommé, une caractéristique du shell Z de l'expansion du nom de chemin, mais cela fonctionne également dans bash, qui ne supporte apparemment pas des choses comme les chemins nommés du shell Z.
~foo
est le répertoire personnel de l'utilisateurfoo
. Si l'utilisateur n'est pas spécifié, l'utilisateur actuel est celui par défaut./some/mount/point
n'est certainement pas mon répertoire personnel.cd ~
m'emmène à/Users/$username/
--quels matchs$HOME
zsh
semble également utiliser le tilde pour indiquer les répertoires nommés.bash -c "ls ~foo/bar"
) - qui n'a pas de répertoires nommés. De plus, même dans zsh, si j'inspecte leenv
, je ne vois aucun répertoire nommé configuré. Je suis sur Mac OS et je pense que c'est une fonctionnalité spécifique à OS X.~foo
. Prenez la chaîne réelle (pas l'exemplefoo
) et faitesgrep "actual username" /etc/passwd
.~text
ne devrait fonctionner que pour les noms d'utilisateur de connexion possibles selon le manuel bash (ne signifie pas nécessairement qu'il est réellement capable de se connecter; dans le cas d'utilisateurs du système tels que~lp
, par exemple). Dans tous mes tests, le~string
correspond àstring
être nom d'utilisateur.Réponses:
Qu'est-ce que ~ foo
Citation du manuel bash (avec un accent supplémentaire):
~foo
se développe dansfoo
le répertoire personnel de l'utilisateur exactement comme spécifié dans/etc/passwd
. Notez que cela peut inclure des noms d'utilisateur système; cela ne signifie pas nécessairement des utilisateurs humains ou qu'ils peuvent réellement se connecter localement (ils peuvent se connecter via des clés SSH par exemple).En fait, comme indiqué dans les commentaires ,
bash
utilisera lagetpwnam
fonction. Cette fonction lui - même est spécifiée par POSIX standard, devrait donc exister dans la plupart des systèmes Unix, y compris macOS X . Cette fonction n'est pas limitée à/etc/passwd
seulement et recherche d'autres bases de données, telles que LDAP et NIS. Extrait particulier dubash
code source ,tilde.c
fichier, à partir de la ligne 394:Exemple pratique
Ci-dessous, vous pouvez voir les tests avec les noms d'utilisateur du système sur mon système. Faites attention à l'
passwd
entrée correspondante et au résultat dels ~username
Même si, par exemple, le
_apt
compte est verrouillé comme suggéré par la sortie,passwd -S apt
il apparaît toujours comme nom de connexion possible:Remarque: ce n'est pas une fonctionnalité spécifique à macOS, mais plutôt une fonctionnalité spécifique au shell.
la source
/etc/shadow
, avec les autres informations d'authentification protégées, comme le mot de passe. La référence danspasswd
est juste de rendre le mot de passe invalide: cela n'empêcherait pas l'authentification par d'autres moyens.testuser
et en modifiant la date d'expiration du mot de passe. Le nom d'utilisateur apparaît toujours à la fin de l'onglet. J'ai supprimé ce morceau de la réponsebash
page de manuel (et la plus ancienne, semble-t-il). L'OP utilise actuellementzsh
(aurait pu être plus clair), bien que dans les commentaires, il soit mentionné qu'ilbash
a le même comportement.getent passwd foo
au lieu degrep foo /etc/password
pour suivre les mêmes mécanismes de recherche que le shell - peut-être y compris les services d'annuaire basés sur le réseau mentionnés par @Abigail.En résumé, pourquoi vous voyez quelque chose
~foo/bar
, c'est parce que vous avez un utilisateur nomméfoo
sur le système avec un dossier nommébar
dans son répertoire personnel.Voir cette solution dans une autre communauté qui explique pourquoi (tilde)
~
est plus qu'un simple "répertoire personnel".Si vous avez un utilisateur nommé
bin
sur votre système, vous pouvez lister le contenu du répertoire personnel de bin par la commande:ls ~bin
Une autre chose que vous pouvez essayer est d'utiliser la complétion de tabulation après avoir tapé ce qui suit à l'invite (ne retournez pas le chariot, utilisez simplement la touche tabulation):
ls -lah ~
tabpour voir la liste des répertoires personnels des utilisateurs qui
~
se développeront si vous continuez. Exemple de sortie (tronquée) de la fin de tabulation dels -lah ~
tabla source
/etc/passwd
. Cela aide immédiatement à clarifier ce qui se passe si l'utilisateur est bien sûr au courant des noms d'utilisateur qu'il a sur le système.~foo
que la saisie semi-automatique ait été effectuée, je peux attester que cefoo
n'est pas un utilisateur sur mon système (et en effet n'existe pas dans/etc/passwd
). De plus, tous les dossiers / fichiers/some/mount/point
apparaissent dans la saisie semi-automatique, ce qui est super intéressant.