Obtener directorio de inicio por nombre de usuario

84

Quiero obtener el directorio de inicio de cualquier usuario con echo

echo ~puchuu
>> /home/puchuu

Pero no puedo usar variable

echo ~$USER
>> ~puchuu
echo `echo ~$USER`
>> ~puchuu
puchu
fuente

Respuestas:

86

Puedes usar eval:

eval echo ~$USER

Pero ver a Andrew 's comentario y Glenn ' s respuesta a continuación.

choroba
fuente
8
En bash eval no se necesita con solo echo ~$usernameestá bien, pero en sh eval es necesario si es una variable
Felipe Alcacibar
Esto a veces da un valor incorrecto, ¿tal vez la carpeta de inicio de una cuenta anterior con el mismo nombre de usuario?
Andrew
@AndrewMacFie: ¿Qué quieres decir con "anterior"?
choroba
1
@choroba Agregue un usuario, elimínelo, luego agregue un usuario con el mismo nombre de usuario. Si la carpeta de inicio del usuario es diferente la segunda vez, este comando proporciona la carpeta de inicio original en lugar de la actual. La respuesta de Glenn Jackman da la actual.
Andrew
Tenga en cuenta también que si eval echo "~$USER"está asumiendo que $USERno contiene caracteres especiales que el shell puede interpretar. Por ejemplo, si USER="foo\$bar", entonces cuando evalel shell lo sustituya $baren su salida, que no es lo que desea. Básicamente, si toma esta ruta, debe asegurarse de que $USERsea ​​una entrada sensata. La mayoría de las veces probablemente lo será, pero debes tener esto en cuenta.
Zorawar
65

Esto podría funcionar para usted:

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

Esto también funcionará en usuarios que no son usted. Por ejemplo,

homedir=$( getent passwd "someotheruser" | cut -d: -f6 )
Glenn Jackman
fuente
Esto es legítimo, usar en getenvlugar de asumir la ubicación passwdes incluso un paso más allá de asumir que la ubicación de la casa es/home/
Evan Carroll
13

Parece que eres ese usuario, ¿por qué no?

echo $HOME

?

Greenoldman
fuente
3
Esto no funcionará si está en un entorno sudo'ed y no pasó sudo las banderas -H o -i: $ HOME seguirá siendo el directorio de inicio del usuario anterior (sudo'ing).
Asfand Qazi
1

No sé si ayuda, pero colocar la tilde fuera de la expresión funciona en ZSH pero no en Bash:

echo ~`echo $USER`
Pedro Penna
fuente
0

Una vez que inicie sesión, ejecute cdpara ir a su directorio de inicio, luego ejecute pwdpara imprimir el directorio de trabajo.

Vinoth Hari
fuente
Eso no va a funcionar; La idea aquí es hacer esto en shell script, y presumiblemente sin requerir las credenciales del usuario en cuestión ...
Samb
-1 por la misma razón que mencionó SamB. Edité su respuesta porque quiero que vea cómo usar el formato Markdown y que sea más conciso. También te perdiste el método mucho más fácil, que es justo echo $HOME.
wjandrea