¿Por qué no se invoca / etc / profile para shells sin inicio de sesión?

51

Shell de inicio y no inicio de sesión definido como:

su - $USER # will give you a login shell
bash # will give you a non-login shell

/ etc / profile no se invoca para shells que no son de inicio de sesión, como cuando inicia konsole (kde). / etc / profile solo se invoca para shells de inicio de sesión.

¿Porqué es eso? Por favor explique, porque me gusta entender la razón de esto.

James Mitch
fuente

Respuestas:

100

/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 ~/.bashrco /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 bashy 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/profilellama. Por ejemplo, en mi sistema Ubuntu 12.04, /etc/profileincluye 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_profileo .bash_loginen el directorio de inicio del usuario. Estos son ignorados por otros proyectiles bash. Pero si .bash_profileexiste, lo bashejecuta en lugar de .profile . Si .bash_profileno existe pero .bash_loginexiste, se ejecuta en lugar de .profile.

    (Pero es común .bash_profileo .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_loginpero si lo uso .profiley luego inicio sesión dashcomo 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:

  1. no hay razón para ejecutarlo más de una vez por inicio de sesión, sería ineficiente o
  2. 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 bashpero mantener su entorno (así que ejecutó bashnuevamente mientras estaba en zsh), y luego ejecutó un programa como mcese que ejecuta un shell como parte de su interfaz. Si binexiste en su carpeta de inicio y su nombre de usuario es james, su PATHen 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

  1. afectar solo el entorno del caparazón en el que se ejecutan, ni siquiera los caparazones secundarios, o
  2. 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 bashera 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 bashincluso 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 bashy 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.bashrco~/.bashrc . Esto se debe a que, por defecto, /etc/profiley ~/.profileejecutarlos de manera explícita. Por ejemplo, ~/.profiletiene:

# 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/profilefuentes /etc/bash.bashrcpara bash.)

Por lo tanto, los archivos "perfil" y "rc" se ejecutan cuando inicia un bashshell 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 -lindicador (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 -ipara root(uso sudo -spara un shell raíz interactivo sin inicio de sesión)
  • sudo -u username -i para cualquier usuario
  • su - usernamepara no rootusuarios (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

Eliah Kagan
fuente
44
Una de las mejores respuestas a cualquier pregunta en cualquier sitio de Stack Exchange.
Mark E. Haase
1
> 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). ¡No no no no no! ¡Absolutamente no! Todos los shells tipo bourne solo leen .profile en sesiones de shell de inicio de sesión interactivo , es decir, aquellos que comenzaron con la opción -i o aquellos conectados a un terminal de control (ninguno de los cuales es cierto si el shell fue iniciado por un administrador de pantalla). La razón por la que esto es cierto es porque el objetivo de este archivo es configurar el terminal del usuario , no solo su entorno. Si un administrador de pantalla tr
Eliah, he reproducido el resto del comentario de Derek aquí, pero he dejado el muñón anterior para que reciba tu notificación de respuesta, aunque no podrá responder a eso debido a los requisitos de reputación. Sin embargo, le he dado acceso de escritura a la sala de chat anterior.
Seth
1
In bash, the "rc" files are actually run whether the shell is interactive or not. Es incorrecto. /etc/bash.bashrc es activado por /etc/bash.profile.
okwap
Okwap es correcto, archivos rc no consigue invocados en shell no interactivo, esto es más concisa y precisa.
Nick Allen