136 votes

Obtenir le répertoire de base par nom d'utilisateur

Je veux obtenir le répertoire personnel de tout utilisateur avec l'écho.

echo ~puchuu
>> /home/puchuu

Mais je ne peux pas utiliser la variable

echo ~$USER
>> ~puchuu
echo `echo ~$USER`
>> ~puchuu

131voto

choroba Points 17339

Vous pouvez utiliser eval :

eval echo ~$USER

Mais voyez Andrew et glenn La réponse de l'entreprise est indiquée ci-dessous.

110voto

Abbas Points 3737

Cela pourrait marcher pour vous :

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

Cela fonctionnera également pour les utilisateurs qui ne sont pas vous. Par exemple,

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

22voto

manjunath Points 11

Il semble que vous soyez cet utilisateur - pourquoi pas

echo $HOME

?

12voto

jsbueno Points 191

Il existe un moyen sûr de le faire !

sur Linux/BSD/macOS/OSX sans sudo ou root

user=pi
user_home=$(bash -c "cd ~$(printf %q "$user") && pwd")

HINWEIS: La raison pour laquelle cela est sûr est que bash (même les versions antérieures à 4.4) possède son propre fichier printf qui comprend :

%q quote the argument in a way that can be reused as shell input

Voir : help printf

Comparer avec la façon dont les autres réponses répondent à l'injection de code

# "ls /" is not dangerous so you can try this on your machine
# But, it could just as easily be "sudo rm -rf /*"
$ user="root; ls /"
$ printf "%q" "$user"
root\;\ ls\ /

# This is what you get when you are PROTECTED from code injection
$ user_home=$(bash -c "cd ~$(printf "%q" "$user") && pwd"); echo $user_home
bash: line 0: cd: ~root; ls /: No such file or directory

# This is what you get when you ARE NOT PROTECTED from code injection
$ user_home=$(bash -c "cd ~$user && pwd"); echo $user_home
bin boot dev etc home lib lib64 media mnt ono opt proc root run sbin srv sys tmp usr var /root

$ user_home=$(eval "echo ~$user"); echo $user_home
/root bin boot dev etc home lib lib64 media mnt ono opt proc root run sbin srv sys tmp usr var

sur Linux/BSD/macOS/OSX en tant que root

Si vous faites cela parce que vous exécutez quelque chose comme root alors vous pouvez utiliser la puissance de sudo :

user=pi
user_home=$(sudo -u "$user" sh -c 'echo $HOME')

sur Linux/BSD (mais pas sur macOS/OSX moderne) sans sudo ou root

Si ce n'est pas le cas, vous pouvez l'obtenir auprès de /etc/passwd . Il existe déjà de nombreux exemples d'utilisation de eval et getent alors je vais donner une autre option :

user=pi
user_home=$(awk -v u="$user" -v FS=':' '$1==u {print $6}' /etc/passwd)

Je ne l'utiliserais vraiment que si j'avais un script bash avec beaucoup d'autres oneliners awk et aucune utilisation de cut . Alors que beaucoup de gens aiment faire du "code golf" pour utiliser le moins de caractères possible pour accomplir une tâche, je préfère le "tool golf" parce qu'utiliser moins d'outils donne à votre script une plus petite "empreinte de compatibilité". De plus, cela représente moins de pages de manuel à lire par votre collègue ou votre futur vous-même pour y comprendre quelque chose.

3voto

Pedro Penna Points 129

Les utilisateurs de ZSH peuvent placer le tilde ( ~ ) en dehors de l'expression. Cela ne fonctionne pas avec Bash :

echo ~`echo $USER`

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X