Qual è la differenza tra .bash_profile e .bashrc?


245

Per creare un alias per il Terminale in OS X, è possibile inserire gli alias in .bash_profileo .bashrc. Qual è la differenza tra i due e perché dovrei scegliere di mettere gli alias in uno e non nell'altro?


5
Non scoraggiare la conoscenza unix qui, ma bash è una pura bestia UNIX, quindi potresti ottenere una migliore conoscenza o avere questa risposta più volte su un sito partner. Ci sono oltre 200 coppie di domande / risposte di bashrc su unix
bmike

C'è anche .profile ... Vedi questa domanda su Stack Overflow.
Yaakov Baruch,

2
Se si brew install bashutilizza iTerm2, è possibile impostare profile -> commandsu /usr/local/bin/bashquale verrà caricato .bashrcper impostazione predefinita dopo .bash_profile. Questo ti dà anche Bash 4 chicche ...
Ray Foss

Ho sentito che .bashrc non è stato usato per anni, e per impostazione predefinita non funzionerà, e .bash_profile è la cosa in macosx. E ho provato .bashrc e t non ha funzionato per me, ma .bash_profile ha funzionato
barlop

Risposte:


247

.bash_profileviene eseguito per le shell di accesso, mentre .bashrcviene eseguito per le shell interattive non di accesso.

Quando si accede (digitare nome utente e password) tramite console, sia seduto sulla macchina, sia da remoto tramite ssh: .bash_profileviene eseguito per configurare la shell prima del prompt dei comandi iniziale.

Ma, se hai già effettuato l'accesso al tuo computer e apri una nuova finestra del terminale (xterm), .bashrcviene eseguita prima del prompt dei comandi della finestra. .bashrcviene eseguito anche quando si avvia una nuova istanza bash digitando /bin/bashun terminale.

Su OS X, Terminal per impostazione predefinita esegue una shell di accesso ogni volta, quindi questo è un po 'diverso dalla maggior parte degli altri sistemi, ma è possibile configurarlo nelle preferenze.


57
On OS X, Terminal by default runs a login shell every time- Sono sempre stato così confuso dal non rendermene conto. Informazioni fantastiche!
vaughan,

1
@Alex, Perché il terminale OS X dovrebbe eseguire una shell di accesso ogni volta?
Pacerier,

17
perché alcuni sviluppatori Apple non hanno capito la differenza originariamente e ora è racchiuso in un jumbo enorme.
Snowcrash,

2
Sono su OS X e uso zshell invece di bash e iTerm invece di Terminal. Nonostante stia usando un terminale diverso e una shell diversa da quella descritta nella risposta, OS X sembra ancora considerare tutto come una shell di accesso, perché .zprofileviene eseguito ogni volta.
Adam Zerner,

1
Per coloro che cercano una spiegazione approfondita delle combinazioni di shell di login / non-login e interattive / non-interattive e quando eseguono questi file di configurazione, consultare unix.stackexchange.com/a/46856/38715
kevinmicke,

45

X11 guarderà il tuo .bashrcmentre guarderà un Terminale "normale".bash_profile

Tuttavia, se aggiungi quanto segue al tuo .bash_profile, puoi quindi spostare tutto nel tuo .bashrcfile in modo da consolidare tutto in un posto anziché due:

if [ -f $HOME/.bashrc ]; then
        source $HOME/.bashrc
fi

O potresti semplicemente fare cd ~ ; ln -s .bashrc .bash_profile.
LHF

5
Questi 2 file di configurazione hanno una funzione chiaramente separata. In alcuni casi, è necessario inizializzare le cose all'inizio della sessione e solo lì ( ~/.bash_profile). Spesso è anche necessario disporre di elementi per definire l'incremento a ogni livello di shell ( ~/.bashrc). Non è la migliore idea suggerire di sopprimere questa libertà.
dan

3
@danielAzuelos: Lurch ha lasciato fuori questa parte, ma il Terminale OS X ha origine ~/.bash_profileper ogni nuova finestra / scheda, quindi non c'è davvero un modo per separare i due per quanto riguarda Terminal.
mipadi,

14
@mipadi C'è ancora valore per separarli. Ad esempio, .bash_profilenon può mai essere di nuovo reperito nel processo figlio. Ogni livello di fonti Bash nidificate .bashrc, quindi se si mette qualcosa di simile export A=a:$Aa .bashrc, il vostro $Aotterrà più in Bash nidificato. In genere lascio la variabile di ambiente nel profilo e gli alias in RC.
Franklin Yu,

@FranklinYu Potrebbe non essere un grosso problema per molte persone, ma sono totalmente d'accordo! È un ottimo punto tecnico per ricordare alle persone e merita molti più voti.
Subfuzion

24

Per macOS, il codice da inserire .bash_profileper consolidare tutto .bashrcè il seguente:

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

Questo è più specifico per l'utente del terminale Mac.


6
Sebbene sia vero, in cosa differisce dalla risposta di Lurch del 2012 ?
Arjan,

0

TLDR; utilizzare .bash_profileper i tuoi alias.

Il modo in cui i diversi file di inizializzazione funzionano insieme è un po 'più complicato e ci sono alcuni casi speciali importanti in OSX. Ecco i punti salienti:

  • Bash, su qualsiasi piattaforma, esegue uno dei numerosi file diversi a seconda di come viene invocato. I dettagli sono qui .
  • L'app Terminale di OSX fa qualcosa di non standard: crea ogni nuova scheda o finestra come se fosse una shell di login, il che significa che .bash_profileviene chiamata. Quindi il consiglio TLDR sopra.
  • .bashrcè anche un'opzione, ma che verrà chiamata ogni volta che si crea una subshell (ovvero, invoke bash), che può creare inefficienza se si aggiorna una variabile al suo interno (ad esempio, PATH=/bin/foo:$PATH)
  • Altre app che dispongono di terminali incorporati possono scegliere di seguire la convenzione dell'app Terminale o meno. In particolare, Visual Studio Code, per impostazione predefinita, non lo fa .
  • Le app invocate tramite la GUI non vengono generate da una shell. Pertanto, ci sono diversi meccanismi in competizione per impostare le variabili di ambiente che possono vedere, che sono cambiate nel corso degli anni .
  • Frammenti che chiamano .bashrcda .bash_profilesono abbastanza comuni. Non lo consiglio, ma è una preferenza.

Perché usare esattamente gli .bash_profilealias è complicato? Gli elementi che elenchi solo parzialmente riguardano gli alias, quindi invece di elencare solo alcuni punti elenco che potrebbero spiegare perché sembra complicato, potresti forse proporre un modo per renderlo più semplice all'interno di questi vincoli?
Nohillside

Vedo il tuo punto. L'utilizzo di .bash_profile non è complicato. È che il modo in cui vengono invocati i file è complicato. Aggiornerò.
Leone,

La chiamata a .bashrc da .bash_profile è raccomandata nel manuale bash di GNU - altrimenti come si impostano le variabili ecc. Che sono necessarie sia nelle shell di login che in quelle non interattive?
Segna il

Ogni emulatore di terminale che utilizzo su diversi sistemi operativi ha un'opzione per eseguire nuove finestre come shell di accesso, xterm e Xfce per nominarne solo due.
fd0
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.