¿Por qué Mac OS X fuente ~ / .bashrc? [duplicar]

95

Esta pregunta ya tiene una respuesta aquí:

Encontré a mucha gente descubriendo por qué una instrucción similar a esta:

Put X to your ~/.bashrc and you can do Y

no trabajes

Siempre resulta que los archivos de inicio de bash de Mac OS X (o el propio Bash de Mac) no obtienen el archivo ~ / .bashrc, ya sea en el shell de inicio de sesión o en un shell generado por el sistema de ventanas, como la aplicación Terminal en Mac OS X)

¿Por qué es esto, cuando todos los otros sistemas similares a Unix con Bash con los que he trabajado antes han hecho esto?

PD:

Encontré lo que Bash dice sobre los archivos de inicio (lo que podría ser útil):

Cuando se invoca Bash como un shell de inicio de sesión interactivo, o como un shell no interactivo con la opción --login, primero lee y ejecuta comandos del archivo / etc / profile, si ese archivo existe. Después de leer ese archivo, busca ~ / .bash_profile, ~ / .bash_login y ~ / .profile, en ese orden, y lee y ejecuta comandos del primero que existe y es legible. La opción --noprofile se puede usar cuando se inicia el shell para inhibir este comportamiento.

Fuente: http://www.gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files

Paul Brewczynski
fuente
También noté que ~/.bash_profilese ejecuta pero no ~/.bashrc. Wierd
igaurav

Respuestas:

90

En OSX, el terminal inicia de forma predeterminada una sesión de inicio de sesión, por lo que lee .bash_profile, etc. (El proceso de inicio de sesión de la GUI que le solicita su nombre y contraseña no utiliza scripts de shell y no inicia ningún shell, todo se realiza desde launchd y el espacio de trabajo)

En otros Unices, xterm ejecuta un shell sin inicio de sesión de forma predeterminada, por lo que leen .bashrc como los scripts que le presentan su contraseña, etc. al iniciar sesión, llaman a la sesión de inicio de sesión y todos los terminales son subprocesos de este y heredan el entorno del shell.

Del documento GNU al que se refirió

Se invoca como un shell interactivo sin inicio de sesión

Cuando se inicia un shell interactivo que no es un shell de inicio de sesión, Bash lee y ejecuta comandos desde ~ / .bashrc, si ese archivo existe. Esto puede inhibirse utilizando la opción --norc. La opción de archivo --rcfile obligará a Bash a leer y ejecutar comandos desde el archivo en lugar de ~ / .bashrc.

Entonces, típicamente, su ~ / .bash_profile contiene la línea

if [ -f ~/.bashrc ]; then . ~/.bashrc; fi 

después (o antes) de cualquier inicialización específica de inicio de sesión.

usuario151019
fuente
77
Unicies = Unixes?
Paul Brewczynski
8
Así Unix que significaba - Me incliné latín en la escuela por lo removedor de la forma plural - ver en.wikipedia.org/wiki/Unix
user151019
8
... y tercera forma "Unixen" (aunque prefiero Unices)
earcam
77
y cuarto "Unicornios" ...
tink
8
no olvidemos la forma nula, es decir, "eunucos"
smatthewenglish
19

bashsolo lee .bashrcpara shells sin inicio de sesión :

Cuando se inicia un shell interactivo que no es un shell de inicio de sesión, bash lee y ejecuta comandos desde ~ / .bashrc, si ese archivo existe. Esto puede inhibirse utilizando la opción --norc. La opción de archivo --rcfile obligará a bash a leer y ejecutar comandos desde el archivo en lugar de ~ / .bashrc.

Como Terminal comienza bashcomo un shell de inicio de sesión (se ejecuta wpara ver que las bashinstancias se ejecutan como -bash), .bashrcnunca se lee automáticamente.

nohillside
fuente
Entonces, el punto es que la aplicación Termina en Mac OS X siempre crea una instancia de "inicio de sesión" de bash. Por qué ? Si realmente no inicias sesión. (Usted
inició
¿Por qué otros sistemas unix leen ~ / .bashrc?
Paul Brewczynski
3
Nadie aquí está en condiciones de explicar las decisiones de diseño tomadas por Apple. Podría discutir fácilmente ambas partes, pero esto tampoco ayuda. Así que simplemente acéptelo tal como es, probablemente sea la mejor opción
nohillside
Bueno, es la primera vez que ejecuta el shell como lo hace, por lo que es un inicio de sesión, en Unices basados ​​en X11 comienza ejecutando el shell que luego ejecuta X, por lo que no es un inicio de sesión
user151019
@PaulBrewczynski Bueno, Linux tiene una llamada de .bash_profile a .bashrc.
Paul Stelian