Bash Manual dice:
Bash intenta determinar cuándo se ejecuta con su entrada estándar conectada a una conexión de red, como cuando lo ejecuta el demonio de shell remoto, generalmente rshd, o el demonio de shell seguro sshd. Si Bash determina que se está ejecutando de esta manera, lee y ejecuta comandos desde ~ / .bashrc, si ese archivo existe y es legible.
Esta fuente de Bash ~/.bashrc
:
ssh user@host :
Pero esta fuente de Bash ~/.bash_profile
:
ssh user@host
No veo una diferencia en estos dos comandos según la especificación. ¿No está stdin conectado a una conexión de red en ambos casos?
Respuestas:
Primero se lee un shell de inicio de sesión
/etc/profile
y luego~/.bash_profile
.Un shell sin inicio de sesión lee desde
/etc/bash.bashrc
y luego~/.bashrc
.¿Por qué es eso importante?
Debido a esta línea en
man ssh
:En otras palabras, si el comando ssh solo tiene opciones (no un comando), como:
Se iniciará un shell de inicio de sesión, se lee un shell de inicio de sesión
~/.bash_profile
.Un comando ssh que tiene un comando , como:
Donde está el comando
:
(o no hacer nada).Será no abrir una shell de inicio de sesión, por lo tanto,
~/.bashrc
es lo que va a ser leído.Remolino estándar
La conexión tty suministrada para / dev / stdin en la computadora remota puede ser un tty real o algo más.
Por:
Que termina en un TTY (no una conexión de red) como lo ve el bash iniciado.
Para una conexión ssh con un comando:
La lista de TTY comienza igual, pero tenga en cuenta que / etc / profile no se obtuvo.
Lo que le dice al shell que la conexión es una tubería (no una conexión de red).
Entonces, en ambos casos de prueba, el shell no puede saber que la conexión es de una red y, por lo tanto, no lee
~/.bashrc
(si solo hablamos de la conexión a una red). Se lee ~ / .bashrc, pero por una razón diferente.fuente
~/.bashrc
leído?stdin
conectado a una red . Por qué asumes eso ? (Respuesta editada, por favor lea).Preguntas sobre el "por qué", no el "cómo", así que intentaré responder desde esa perspectiva. Lo siguiente será una buena razón de por qué las cosas sucedieron en el pasado para resultar en cómo suceden hoy.
La razón para tener dos archivos de inicio diferentes ("perfil" y "rc") es que en el pasado la forma común de trabajar en una máquina era:
Inicie sesión desde algún tipo de terminal real u otra estación de trabajo y obtenga un shell de inicio de sesión . Este shell invocará
/etc/profile
y~/.profile
configurará el entorno para el usuario.Invoque el entorno en el que el usuario desea ingresar. Este entorno podría ser Xorg, pero en la mayoría de los casos era un multiplexor como la pantalla GNU.
El entorno (por ejemplo, la pantalla GNU) invocaría shells adicionales (sin inicio de sesión) que heredan el entorno del shell de inicio de sesión principal.
Esa era la forma común de iniciar sesión en una máquina UNIX durante el tiempo en que
csh
ybash
se estaban desarrollando. Por lo~/.profile
tanto , se consideró un desperdicio leer de nuevo en los depósitos que heredaban el medio ambiente de todos modos.bash
luego se agregó~/.bashrc
para una configuración adicional para estos shells sin inicio de sesión.csh
(ytcsh
) nunca agregó ningún tipo de archivo "rc" para shells sin inicio de sesión. Tenga en cuenta quecsh
/tcsh
no son shells compatibles con el bourne shell (que es parte de POSIX) mientras lobash
sea. Otro shell compatible con bourneksh
, agregó una variable de entorno (llamadaENV
) que, si se definiera, se usaría como un archivo de comandos de ejecución ("rc") para no iniciar sesiónksh
.Entonces, sí, las versiones más recientes de los bourne shells agregaron el archivo de configuración adicional como una conveniencia para los alias y otras opciones rápidas que estarían presentes dentro de los shells muxed por la pantalla GNU (o similar) pero no presentes en el shell que obtienes cuando ingresas por primera vez máquina.
Con el aumento de los administradores de pantallas gráficas (GDM), la diferenciación entre los archivos "perfil" y "rc" dejó de tener sentido porque el GDM tendría sus propios archivos de inicialización (por ejemplo,
~/.xinit
y~/.xsession
). Luego, los shells declarados desde el interior del GDM podrían ser shells de inicio de sesión o de no inicio de sesión, dependiendo de los caprichos de un usuario, y el caso en el que un shell de no inicio de sesión siempre tendría un padre que es un shell de inicio de sesión ya no es cierto.Extra
Una de mis tablas favoritas sobre la comparación de archivos de inicio de shell muestra cómo los shells compatibles con bourne shell usan los
profile
archivos mientras que otros shells no. Esto se debe a que en el pasado el shell inicial (el que inició el muxer) necesitaba ser un shell compatible con bourne.fuente