/etc/profile
se invoca solo para shells de inicio de sesión porque ese es su propósito específico.
Si desea que se ejecute un comando para shells interactivos que no son shells de inicio de sesión, y lo está utilizando bash
, póngalo en ~/.bashrc
o /etc/bash.bashrc
.
El propósito de los archivos de "perfil" es contener comandos que deben ejecutarse solo para shells de inicio de sesión. Estos archivos son:
/etc/profile
, ejecutado por todos los shells compatibles con Bourne (incluidos bash
y dash
) cuando se inicia como un shell de inicio de sesión.
Guiones en /etc/profile.d
.
Esto es para shells de estilo Bourne, pero no está codificado en el ejecutable del shell. Más bien, los comandos en los /etc/profile
llama. Por ejemplo, en mi sistema Ubuntu 12.04, /etc/profile
incluye estas líneas:
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
.profile
en el directorio de inicio del usuario, ejecutado por shells compatibles con Bourne cuando se inicia como un shell de inicio de sesión (a menos que se anule, consulte a continuación).
.bash_profile
o .bash_login
en el directorio de inicio del usuario. Estos son ignorados por otros proyectiles bash
. Pero si .bash_profile
existe, lo bash
ejecuta en lugar de .profile
. Si .bash_profile
no existe pero .bash_login
existe, se ejecuta en lugar de .profile
.
(Pero es común .bash_profile
o .bash_login
, cuando existe, escribirse para * llamar explícitamente .profile
).
El beneficio de los archivos de perfil específicos del shell es que pueden contener comandos o sintaxis que solo son válidos para ese shell. Por ejemplo, puedo usar el [[
operador de evaluación en .bash_profile
/ .bash_login
pero si lo uso .profile
y luego inicio sesión dash
como mi shell, fallará.
Qué debe ir en los archivos de "perfil"
Los archivos de "perfil" deben contener comandos que solo deben ejecutarse una vez, al comienzo del inicio de sesión. (Esto incluye inicios de sesión gráficos, ya que también comienzan con un shell de inicio de sesión). Si un shell es interactivo, el usuario que lo ejecuta probablemente haya iniciado sesión, por lo que probablemente tenga un antepasado (que lo inició o comenzó lo que lo inició, o comenzó eso, etc.) que era un shell de inicio de sesión.
Es posible que desee ejecutar un comando solo una vez porque:
- no hay razón para ejecutarlo más de una vez por inicio de sesión, sería ineficiente o
- produciría un resultado no deseado, ejecutarlo más de una vez por inicio de sesión.
Como ejemplo de la segunda situación, donde ocurriría un resultado indeseable, considere estas líneas, que aparecen por defecto en cada usuario ~/.profile
:
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
Suponga que ingresó SSH, ejecutó otro shell (digamos zsh
), en algún momento descubrió que deseaba regresar temporalmente bash
pero mantener su entorno (así que ejecutó bash
nuevamente mientras estaba en zsh
), y luego ejecutó un programa como mc
ese que ejecuta un shell como parte de su interfaz. Si bin
existe en su carpeta de inicio y su nombre de usuario es james
, su PATH
en el shell más interno es algo así como:
/home/james/bin:/home/james/bin:/home/james/bin:/home/james/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Eso es ineficiente y (mucho más importante) hace que sea difícil entender el contenido de PATH
.
Sin embargo, esto no es en absoluto un desastre. Por lo que puedo decir, si cada shell interactiva obtuviera archivos de "perfil", no ocurriría nada terrible en la configuración predeterminada . Sin embargo, dado que el propósito de los archivos de "perfil" es contener comandos para que solo se ejecuten una vez por inicio de sesión , un usuario o administrador puede agregar comandos a un perfil que solo debe ejecutarse al iniciar un shell de inicio de sesión.
Dónde colocar comandos para que se ejecute cada shell interactivo
Si está utilizando bash
, hay archivos para los comandos que se ejecutarán en cada shell interactivo:
/etc/bash.bashrc
.bashrc
en el directorio de inicio del usuario.
Esto se usa más comúnmente para comandos que
- afectar solo el entorno del caparazón en el que se ejecutan, ni siquiera los caparazones secundarios, o
- debería ejecutarse incluso cuando este no es el shell de inicio de sesión.
Por ejemplo, la finalización de tabulación de la línea de comandos generalmente debería habilitarse independientemente de si bash
era el shell de inicio de sesión. Entonces esto aparece en ~/.bashrc
:
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
. /etc/bash_completion
fi
Allí, se aplican 1 y 2 : esto no se transfiere a otros shells que se ejecutan dentro de este, y la finalización de tabulación debería funcionar bash
incluso si inicié sesión con un shell diferente.
Dónde colocar comandos para shells de inicio de sesión y shells interactivos sin inicio de sesión
Si está utilizando bash
y desea que se ejecute un comando en shells de inicio de sesión y shells interactivos y que no son shells de inicio de sesión, generalmente es suficiente ponerlo en /etc/bash.bashrc
o~/.bashrc
. Esto se debe a que, por defecto, /etc/profile
y ~/.profile
ejecutarlos de manera explícita. Por ejemplo, ~/.profile
tiene:
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
(Del mismo modo, /etc/profile
fuentes /etc/bash.bashrc
para bash
.)
Por lo tanto, los archivos "perfil" y "rc" se ejecutan cuando inicia un bash
shell interactivo (sea o no un shell de inicio de sesión).
Dónde colocar comandos para ejecutar en shells no interactivos
Probablemente no desee especificar ningún comando para que se ejecuten todos los shells no interactivos; se ejecutarían cada vez que se ejecuta un script (siempre que el script lo ejecute el shell que configuró para ejecutarlos).
Esto puede causar una rotura sustancial. Si va a hacer esto, y no hay una cuenta de administrador en el sistema además de la que está utilizando, puede crear una; eso puede facilitar la reparación de errores.
En bash
, los archivos "rc" se ejecutan independientemente de si el shell es interactivo o no . Sin embargo, en la parte superior dicen:
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
Entonces, si necesita que los comandos se ejecuten automáticamente incluso en shells no interactivos como los que se ejecutan para ejecutar scripts, puede agregar sus comandos antes de esas líneas.
Inicio de un Shell de inicio de sesión
Iniciar sesión inicia un shell de inicio de sesión. Si desea que un shell iniciado después de eso se comporte como un shell de inicio de sesión, comience con el -l
indicador (significa l ogin ). Por ejemplo:
Esa es la mejor manera de iniciar un shell de inicio de sesión (sin iniciar sesión) a menos que desee iniciar uno como otro usuario. Luego, use:
sudo -i
para root
(uso sudo -s
para un shell raíz interactivo sin inicio de sesión)
sudo -u username -i
para cualquier usuario
su - username
para no root
usuarios (uso para un shell raíz interactivo sin inicio de sesión)su username
¿Qué es un shell de inicio de sesión inicial ?
Un shell de inicio de sesión inicial es lo mismo que un shell de inicio de sesión . En todas partes esta respuesta dice "shell de inicio de sesión" podría decir "shell de inicio de sesión inicial" (excepto en esta sección, que ya habría dejado de tener sentido).
Una razón para el término shell de inicio de sesión inicial es que el shell de inicio de sesión también se usa en un sentido diferente: para identificar qué programa se usa como el shell que se ejecuta al iniciar sesión. Este es el sentido del shell de inicio de sesión utilizado para decir:
- " El shell de inicio de sesión predeterminado de OpenBSD es
ksh
; en Ubuntu, es bash
".
- "Puede cambiar su shell de inicio de sesión con
chsh
".
Otras lecturas