Una pregunta rara, lo sé. Aquí está el guión:
echo $USER
Aquí está el comando que uso para ejecutarlo:
sudo ./myscript.sh
En este momento imprime "root" pero quiero que imprima jon
mi nombre de usuario. ¿Hay alguna manera de hacerlo cambiando el script y no el comando?
Respuesta1
Utilice la SUDO_USER
variable de entorno en lugar de USER
.
sudo
coloca el nombre del usuario que lo ejecutó en la SUDO_USER
variable de entorno:
ek@Io:~$ sudo sh -c 'echo $USER'
[sudo] password for ek:
root
ek@Io:~$ sudo sh -c 'echo $SUDO_USER'
ek
Entonces puedes simplemente reemplazar $USER
con $SUDO_USER
en tu script:
echo $SUDO_USER
Otras lecturas
man sudo
, en el apartado de "MEDIO AMBIENTE":SUDO_USER Set to the login name of the user who invoked sudo.
La página de manual también describe algunas otras variables de entorno relacionadas definidas por
sudo
que pueden resultar útiles, comoSUDO_UID
ySUDO_GID
¿Obtener $USER dentro del script de shell cuando se ejecuta con sudo?
Respuesta2
Además deLa respuesta de @Eliah Kagan arriba, me gustaría señalar que también puedes tener fácilmente una expansión que funcione tanto si se ejecuta en un sudo
contexto como si no:
echo "${SUDO_USER:-$USER}"
Esto se expande al valor de $SUDO_USER
de forma predeterminada, pero si esa variable no está configurada o está vacía, vuelve al valor de $USER
.
$ bash -c 'echo "${SUDO_USER:-$USER}"'
bytecommander
$ sudo bash -c 'echo "${SUDO_USER:-$USER}"'
bytecommander
Puede encontrar más información sobre la expansión de parámetros predeterminados en Bash, por ejemplo, enhttps://wiki.bash-hackers.org/syntax/pe#use_a_default_value.