Chaque shell a une variable d'environnement $ HOME définie (ex:) /Users/lotolo
. Si je suis sous csh, je peux unsetenv HOME
et encore si je le fais, cd
je serai chez moi. J'ai également testé cela sur bash ( unset HOME
) et c'est le même comportement. Alors, comment le shell sait-il où se trouve mon / autre_utilisateur? Où lit-il ces valeurs?
Ce n'est pas un doublon car ma question n'est pas de savoir comment je sais, mais comment le shell sait-il HOME
. Et ce comportement est également étendu aux autres utilisateurs.
/etc/passwd
. Certains systèmes peuvent stocker ces informations dans LDAP, des serveurs NIS, etc.getpwuid(3)
ou similaires. Certains systèmes peuvent être configurés pour "réacheminer"getpwuid(3)
pour récupérer des informations à partir de/etc/passwd
LDAP, NIS, NIS + etc.Réponses:
Dans le cas de
csh
ettcsh
, il enregistre la valeur de la$HOME
variable au moment du démarrage du shell ( dans sa$home
variable comme noté par @JdeBP ).Si vous le désactivez avant de commencer
csh
, vous verrez quelque chose comme:Pour
bash
(et la plupart des autres obus de type Bourne), je vois un comportement différent du vôtre.Le contenu de la
$HOME
variable est initialisé par le processus de connexion sur la base des informations stockées dans la base de données utilisateur par rapport à votre nom d' utilisateur .Les informations sur le nom d'utilisateur lui-même ne sont pas toujours disponibles. Tout ce qu'un shell peut savoir avec certitude, c'est l'ID utilisateur du processus qui l'exécute et plusieurs utilisateurs (avec des répertoires personnels différents) peuvent partager le même ID utilisateur.
Donc, une fois
$HOME
parti, il n'y a aucun moyen fiable de le récupérer.L'interrogation de la base de données utilisateur (avec
getpwxxx()
l'API standard) pour le répertoire personnel du premier utilisateur qui a le même uid que celui qui exécute le shell ne serait qu'une approximation (sans parler du fait que la base de données utilisateur aurait pu changer (ou le répertoire principal) répertoire étant défini comme une valeur unique) depuis le début de la session de connexion).zsh
est le seul shell que je connaisse qui fait ça:Tous les autres shells que j'ai essayés se plaignent de ce HOME non défini ou utilisent
/
comme valeur par défaut.Pourtant, un comportement différent est celui
fish
de, qui semble interroger la base de données pour le nom d'utilisateur stocké dans le$USER
cas échéant ou faire ungetpwuid()
sinon:SEGV lorsque l'utilisateur n'existe pas ( https://github.com/fish-shell/fish-shell/issues/3599 ):
la source
fish
la tête de développement de git pour voir si le bug est là aussi. Modifier. Oui, ça l'est.PATH
?TERM
?USER
?Querying the user database
...would only be...
pas si clair en effetCe n'est pas le cas. Vous ne faites tout simplement pas l'expérience correctement. Comme vous pouvez le voir dans le manuel du shell C, la
cd
commande change la valeur de lahome
variable si elle est fournie sans argument. Si cette variable n'est pas définie, elle ne sait pas où changer de répertoire et affiche une erreur:Vous annulez la mauvaise variable. Ce n'est pas
HOME
la variable d'environnement, c'esthome
la variable interne du shell C (initialisée à partir de la valeur de la première au démarrage du shell, mais sinon une variable indépendante à part entière).la source
csh
mais apparemment, il a un aliastcsh
Le système a défini la variable HOME au moment de la connexion comme étant un chemin d'accès au répertoire personnel de l'utilisateur. Il est défini par
Vous pouvez changer sa valeur mais faites attention car .bashrc, .profile, .xinitrc, etc. ne seront pas lus s'ils ne sont pas dans le répertoire personnel.
la source
usermod -d HOME_DIR
commande, lorsqu'un nouvel usre est créé. le répertoire par défaut est / home / $ username et il est déterminé par le programme de connexion.