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

Respuestas:


86

Puedes usar eval:

eval echo ~$USER

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


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 )

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

?


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`

0

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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.