bashrc o bash_profile?

49

Sé la diferencia entre los dos scripts de inicio de sesión de bash:

.bashrc se ejecuta solo con shells "sin inicio de sesión".

.bash_profile(o .bash_logino .profile) es ejecutado por conchas "Login".

¿Alguien tiene algunos buenos ejemplos de las cosas que mejor se ajustan a la ejecución solo de inicio de sesión, de modo que solo las pondría .bash_profile, pero realmente no tendrían sentido .bashrc?

(Sé que la mayoría de nosotros proviene .bashrcde .bash_profile, por lo que no parece tener mucho sentido la pregunta opuesta ...)

Don faulkner
fuente
3
Vea también la misma pregunta en Super User .
Gilles 'SO- deja de ser malvado'

Respuestas:

24

Como a .bashrces para shells que no son de inicio de sesión, evito cualquier comando que haga eco en la pantalla. También me he encontrado con experiencias en las que las declaraciones echo .bashrccausarán que los comandos sftp y rsync fallen (y tal vez también los comandos scp).

# Print some information as we log in
# -s: OS Name -n: Node name -r: OS Release
uname -snr
uptime

Además, generalmente no ejecutará ssh-agent desde un shell no interactivo. Entonces tengo esto adentro .bash_profile.

if [ -f ~/.ssh/ssh-agent ]; then . ~/.ssh/ssh-agent; fi
Stefan Lasiewski
fuente
2
Si usa ~ / .profile en lugar de ~ / .bash_profile, las cosas seguirán funcionando incluso si cambia los shells. ~ / .Bash_profile es para cosas específicas de bash.
LassePoulsen
1
Pero bash solo ejecutará CUALQUIER .bash_profile O .profile, por lo que si va a utilizar ambos, debe obtener .profile desde dentro de .bash_profile o algo así. Esa no es una mala idea, en realidad ...
Don Faulkner
@Source & @Don: buenos puntos. Solía ​​tener Bashisms en mi .bash_profile, pero ahora he cambiado a algo más universal. Quizás usar .profile esté en orden.
Stefan Lasiewski
Con respecto a los comandos de producción de salida que .bashrcinterfieren con los métodos de transferencia remota de archivos implementados a través de flujos estándar , la solución es colocar dichos comandos en un código que verifique si el shell es interactivo y continúa solo si lo es. Los .bashrcarchivos predeterminados de los usuarios en Ubuntu, copiados desde la /etc/skel/.bashrccreación de la cuenta, así como en todo el sistema /etc/bash.bashrc, ya contienen código que verifica y devuelve si el shell no es interactivo (aunque uno todavía debe poner los comandos de producción de salida debajo de ellos).
Eliah Kagan
8

Byobu es un gran ejemplo de algo que nunca deberías poner en .bashrc.

De lo contrario, se ejecutará recursivamente en cada uno de sus 'terminales virtuales' ;-)

Sin embargo, puedes probarlo, es divertido.

Es por eso que lo pones .profile, por lo que byobu (que realmente es una simple envoltura alrededor de la pantalla) solo se carga, una vez, al momento de iniciar sesión. Y byobu mismo puede comenzar nuevas sesiones interactivas de bash.

Ralf
fuente
Ese es un buen ejemplo. Gracias por el puntero a Byobu también. Ahora para ir a probarlo.
Don Faulkner