¿Por qué tengo que `fuente .profile` en cada terminal que abro?

10

Cuando cambiamos alguna variable en ~/.profileUbuntu, ejecutamos el comando source .profile. Entonces el cambio es efectivo solo en este terminal. Si abrimos una nueva terminal, tenemos que ejecutar el comando source .profilenuevamente. Parece que diferentes terminales tienen su propio entorno, aunque pueden pertenecer al mismo usuario.

¿Cuál es la ventaja de hacer que cada terminal tenga su propia ruta de entorno? Parece que sería mejor si un terminal diferente que perteneciera al mismo usuario compartiera la misma variable de entorno.

cainiaofei
fuente
2
Posible duplicado de ¿Cómo configuro las variables de entorno?
galoget
Si su "shell" de inicio de sesión es una GUI, no ayuda mucho configurar la secuencia de comandos de inicio de sesión var en sh en lugar de su GUI.
ikegami

Respuestas:

14

La razón de esto es que ~/.profilesolo proviene de shells de inicio de sesión. Cuando abre una nueva ventana de terminal, el shell que se inicia es un shell sin inicio de sesión de forma predeterminada. Si cierra sesión y vuelve a iniciar sesión, el cambio ~/.profileserá efectivo en todas sus terminales, ya que ~/.profilese origina cuando inicia sesión en su sesión.

No es el caso de que las diferentes ventanas de terminal tengan un entorno diferente, sino que el abastecimiento ~/.profilesolo se ejecuta ~/.profileen el shell actual (eso es exactamente lo que hace el sourcecomando).

Por el contrario, un cambio en ~/.bashrcafectará inmediatamente a cualquier nueva ventana de terminal que abra, o cualquier shell de Bash que comience escribiendo bash, ya que se obtiene de todos los shells interactivos de Bash.

Zanna
fuente
3

Las variables de entorno no son solo para las preferencias del usuario. Son un mecanismo genérico para comunicar una variedad de información de configuración de un proceso primario a procesos secundarios que comienza.

Existen numerosos casos en los que un proceso establecerá variables de entorno específicas para influir solo en los procesos que inicia. Por ejemplo, un script puede restablecer deliberadamente la configuración regional de los comandos que inicia, de modo que pueda analizar la salida de ellos. Los scripts de compilación para muchos paquetes de software grandes utilizan invocaciones anidadas de makeesa coordenada entre sí a través de variables de entorno. Es posible que las herramientas especializadas necesiten cambiar las condiciones de trabajo de otros programas que comienzan haciendo trucos con $ LD_PRELOAD o $ PATH.

Si algo que un usuario hace en una ventana diferente mientras se ejecuta una compilación larga en otra, mágicamente cambiaría las variables de entorno de todos sus procesos a sus espaldas, se produciría locura y caos.

Otras variables de entorno contienen información sobre la sesión particular en la que se inicia un proceso. Los programas esperan que $ TERM describa el conjunto de comandos del terminal particular (o emulador de terminal) al que están conectados; hacer que una configuración general por usuario haga imposible iniciar sesión en el mismo sistema con varios tipos diferentes de terminales. Incluso si solo tiene una pieza de hardware de terminal y nunca inicia sesión de forma remota, los programas screendependen de establecer un $ TERM diferente para los procesos que se ejecutan dentro de su sesión.

Una mejor pregunta sería, ¿por qué utilizamos un mecanismo de comunicación de proceso a subproceso para la configuración de preferencias del usuario, en lugar de una base de datos por usuario?

Respuesta: Debido a que funciona bastante bien y los beneficios de hacer una base de datos por usuario no son lo suficientemente grandes que el trabajo de cambiar todo de usar que en lugar de variables de entorno que se haría.

(Puedo pensar en muy pocas configuraciones de preferencias en las que no habría algunos casos de uso en los que sea conveniente cambiarlas solo para ejecutar un solo script, por ejemplo. Por lo tanto, para no perder la funcionalidad, todo aún debería ser reemplazado por variables de entorno, lo que resulta en una mayor complejidad y usuarios más confundidos).

No es que no existan alternativas . Por ejemplo, los recursos X son por sesión de visualización en lugar de por proceso. Pero son difíciles de acceder para los programas de línea de comandos, y los programas de línea de comandos generalmente necesitan trabajar para inicios de sesión remotos que ni siquiera tienen un servidor X para conectarse.

hmakholm dejó a Monica
fuente