.bashrc
es un archivo de configuración de bash, solo cuando se ejecuta de forma interactiva. Solo se carga cuando inicia bash, no cuando ejecuta algún otro programa como sh
(ni siquiera si se invoca bash a través del nombre sh
). Y solo se carga cuando bash es interactivo, no cuando ejecuta un script o un comando con-c
.
sudo sh -c 'echo $PATH'
o sudo bash -c 'echo $PATH'
no invoca un shell interactivo, entonces.bashrc
lo que no está involucrado.
sudo su; echo $PATH
ejecuta una instancia interactiva del shell de root. Si eso es bash, entonces ~root/.bashrc
se carga. Este fragmento se ejecuta echo $PATH
una vez que este shell interactivo finaliza, por lo que lo que suceda en el shell interactivo no tiene influencia sobre lo que imprime el fragmento al final. Pero si escribe echo $PATH
en el indicador del shell interactivo iniciado por sudo su
, verá el valor establecido por ~root/.bashrc
.
Dado que .bashrc
se invoca en cada shell interactivo, no por shells de inicio de sesión (ni siquiera por shells de inicio de sesión interactivo, que es un defecto de diseño en bash), es el lugar incorrecto para definir variables de entorno. Úselo .bashrc
para configuraciones de bash interactivas, tales como combinaciones de teclas, alias y configuraciones de finalización. Establezca variables de entorno en los archivos que se cargan al iniciar sesión: ~/.pam_environment
o~/.profile
.
Así que establece PATH
en .profile
lugar de .bashrc
, y, o bien ejecutar una shell de entrada con sudo -i 'echo $PATH'
, o fuente explícitamente .profile
con sudo sh -c '. ~/.profile; echo $PATH'
.
.profile
? ¿Quieres decir/root/.profile
o/home/user/.profile
? Traté de agregarexport PATH=$PATH:/mydir
a ambos. No funcionó Lo intenté sinexport
eso tampoco funcionó.Mira el
-E
y-i
opciones .-E
: Indica a la política de seguridad que el usuario desea preservar sus variables de entorno existentes. La política de seguridad puede devolver un error si el usuario no tiene permiso para preservar el entorno.-i
: Ejecute el shell especificado por la entrada de la base de datos de contraseñas del usuario objetivo como un shell de inicio de sesión. Esto significa que el shell leerá los archivos de recursos específicos de inicio de sesión como .profile o .login. Si se especifica un comando, se pasa al shell para su ejecución a través de la opción -c del shell. Si no se especifica ningún comando, se ejecuta un shell interactivo. sudo intenta cambiar al directorio de inicio de ese usuario antes de ejecutar el shell. El comando se ejecuta con un entorno similar al que recibiría un usuario al iniciar sesión. La sección Entorno del comando en el manual de sudoers (5) documenta cómo la opción -i afecta el entorno en el que se ejecuta un comando cuando la política de sudoers es en uso.fuente
Podría hacerlo
sudo bash
, lo que sí lee losbash
archivos de inicio como se documenta en labash
página del manual / documentación. Sin embargo, tenga en cuenta que es posible que no establezca laHOME
variable de entorno correctamente. Esto se puede solucionar en elbash
archivo de inicio de todo el sistema (en/etc
, la ubicación exacta depende de la distribución): pruebe si$uid
es 0.fuente