Obtenir le répertoire personnel par nom d'utilisateur

84

Je veux obtenir le répertoire personnel de n'importe quel utilisateur avec écho

echo ~puchuu
>> /home/puchuu

Mais je ne peux pas utiliser variable

echo ~$USER
>> ~puchuu
echo `echo ~$USER`
>> ~puchuu
puchu
la source

Réponses:

86

Vous pouvez utiliser eval:

eval echo ~$USER

Mais voir le commentaire d’ Andrew et la réponse de glenn ci-dessous.

choroba
la source
8
In bash eval n'est pas nécessaire echo ~$username, mais c'est correct, mais dans sh eval, une variable est nécessaire
Felipe Alcacibar
Cela donne parfois une mauvaise valeur, peut-être le dossier de départ d'un compte précédent avec le même nom d'utilisateur?
Andrew
@AndrewMacFie: Qu'entendez-vous par "précédent"?
Choroba
1
@choroba Ajoutez un utilisateur, supprimez-le, puis ajoutez un utilisateur avec le même nom d'utilisateur. Si le dossier de base de l'utilisateur est différent la deuxième fois, cette commande donne le dossier de départ d'origine plutôt que le dossier actuel. La réponse de Glenn Jackman donne la réponse actuelle.
Andrew
Notez également que si vous eval echo "~$USER"faites l'hypothèse qui $USERne contient pas de caractères spéciaux que le shell peut interpréter. Par exemple, si USER="foo\$bar", alors, evalle shell va substituer $bardans votre sortie ce qui n’est pas ce que vous voulez. Fondamentalement, si vous prenez cette route, vous devez vous assurer que cette $USERentrée est saine. La plupart du temps, ce sera probablement le cas, mais vous devez en tenir compte.
Zorawar
65

Cela pourrait fonctionner pour vous:

homedir=$( getent passwd "$USER" | cut -d: -f6 )

Cela fonctionnera également sur des utilisateurs autres que vous. Par exemple,

homedir=$( getent passwd "someotheruser" | cut -d: -f6 )
Glenn Jackman
la source
C’est légitime, utiliser getenvplutôt que de supposer que l’emplacement de la maison passwdest encore plus loin que de supposer que l’emplacement de la maison est/home/
Evan Carroll
13

Il semble que vous soyez cet utilisateur - pourquoi pas

echo $HOME

?

greenoldman
la source
3
Cela ne fonctionnera pas si vous êtes dans un environnement sensible et que vous n'avez pas transmis à sudo les indicateurs -H ou -i - $ HOME restera le répertoire personnel de l'utilisateur précédent (sudoing).
Asfand Qazi
1

Je ne sais pas si cela peut aider, mais placer le tilde en dehors de l'expression fonctionne sur ZSH mais pas sur Bash:

echo ~`echo $USER`
Pedro Penna
la source
0

Une fois que vous vous êtes connecté, exécutez cdpour accéder à votre répertoire personnel, puis pwdimprimez le répertoire de travail.

Vinoth Hari
la source
Cela ne va pas au travail; L'idée ici est de faire cela dans un script shell, et sans doute sans exiger les informations d'identification de l'utilisateur en question ...
SamB
-1 pour la même raison que SamB a mentionnée. J'ai modifié votre réponse parce que je veux que vous sachiez comment utiliser le formatage de Markdown et que vous soyez plus concis. Vous avez également manqué la méthode beaucoup plus facile, qui est juste echo $HOME.
Wjandrea