Perché Mac OS X non genera ~ / .bashrc? [duplicare]


95

Questa domanda ha già una risposta qui:

Ho trovato molte persone a capire perché istruzioni simili a questa:

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

non funziona.

Si scopre sempre che i file di avvio di bash di Mac OS X (o lo stesso Bash di Mac) non generano file ~ / .bashrc, né nella shell di accesso, né in una shell generata dal sistema di finestre - come l'app Terminale in Mac OS X)

Perché, quando tutti gli altri sistemi simili a Unix con Bash con cui ho lavorato prima lo hanno fatto?

PS:

Ho trovato quello che dice Bash stesso sui file di avvio (che potrebbero essere utili):

Quando Bash viene invocato come shell di login interattiva o come shell non interattiva con l'opzione --login, legge ed esegue prima i comandi dal file / etc / profile, se quel file esiste. Dopo aver letto quel file, cerca ~ / .bash_profile, ~ / .bash_login e ~ / .profile, in quell'ordine, e legge ed esegue i comandi dal primo che esiste ed è leggibile. L'opzione --noprofile può essere usata all'avvio della shell per inibire questo comportamento.

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


Ho anche notato che ~/.bash_profileviene eseguito ma non ~/.bashrc. Wierd.
igaurav,

Risposte:


90

In OSX il terminale per impostazione predefinita avvia una sessione di accesso in modo da leggere .bash_profile ecc. (Il processo di accesso alla GUI che richiede il tuo nome e la password non utilizza script di shell e non avvia alcuna shell è tutto fatto da launchd e dallo spazio di lavoro)

Su altri Unices xterm esegue una shell non di accesso di default in modo che leggano .bashrc come gli script che ti presentano la tua password ecc. Al momento dell'accesso chiamano la sessione di accesso e tutti i terminali ne fanno un processo secondario ed ereditano l'ambiente della shell.

Dal documento GNU a cui ti riferivi

Richiamato come shell interattiva non di accesso

Quando viene avviata una shell interattiva che non è una shell di accesso, Bash legge ed esegue i comandi da ~ / .bashrc, se quel file esiste. Questo può essere inibito usando l'opzione --norc. L'opzione --rcfile forzerà Bash a leggere ed eseguire i comandi dal file invece di ~ / .bashrc.

Quindi, in genere, il tuo ~ / .bash_profile contiene la linea

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

dopo (o prima) qualsiasi inizializzazione specifica per il login.


7
Unicies = Unix?
Paul Brewczynski,

8
Bene Unices intendevo: mi sono avvicinato al latino a scuola, quindi rimuovo la forma plurale - vedi en.wikipedia.org/wiki/Unix
user151019

8
... e terza forma "Unixen" (anche se preferisco Unices)
earcam

7
e quarto "Unicorns" ...
tink

8
non dimentichiamoci della forma nulla, ovvero "eunuchi"
smatthewenglish

19

bashlegge solo .bashrcper shell non di accesso :

Quando viene avviata una shell interattiva che non è una shell di accesso, bash legge ed esegue i comandi da ~ / .bashrc, se quel file esiste. Questo può essere inibito usando l'opzione --norc. L'opzione --rcfile forzerà bash a leggere ed eseguire comandi dal file anziché ~ / .bashrc.

Poiché Terminal inizia bashcome shell di login (eseguire wper vedere che le bashistanze vengono eseguite come -bash), .bashrcnon viene mai letto automaticamente.


Quindi il punto è che l'app Termina su Mac OS X crea sempre un'istanza "login" di bash? Perché ? Se davvero non accedi. (Hai effettuato l'accesso in precedenza dalla GUI)
Paul Brewczynski,

Perché altri sistemi unix leggono ~ / .bashrc?
Paul Brewczynski,

3
Nessuno qui è in grado di spiegare le decisioni di progettazione prese da Apple. Potrei facilmente discutere entrambe le parti, ma neanche questo aiuta. Quindi accettalo perché è probabilmente l'opzione migliore
nohillside

Bene, è la prima volta che esegui la shell come te, quindi è un login, in Unices basati su X11 inizi eseguendo la shell che esegue X quindi non è un login
user151019

@PaulBrewczynski Bene Linux ha una chiamata da .bash_profile a .bashrc.
Paul Stelian,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.