Cuando cambiamos alguna variable en ~/.profile
Ubuntu, 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 .profile
nuevamente. 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.
environment-variables
.profile
cainiaofei
fuente
fuente
Respuestas:
La razón de esto es que
~/.profile
solo 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~/.profile
será efectivo en todas sus terminales, ya que~/.profile
se 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
~/.profile
solo se ejecuta~/.profile
en el shell actual (eso es exactamente lo que hace elsource
comando).Por el contrario, un cambio en
~/.bashrc
afectará inmediatamente a cualquier nueva ventana de terminal que abra, o cualquier shell de Bash que comience escribiendobash
, ya que se obtiene de todos los shells interactivos de Bash.fuente
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
make
esa 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
screen
dependen 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.
fuente