Perché ~ / .bash_profile non proviene quando si apre un terminale?


175

Problema

Ho una macchina virtuale Ubuntu 11.04 e volevo configurare il mio ambiente di sviluppo Java. Ho fatto come segue

  1. sudo apt-get install openjdk-6-jdk
  2. Aggiunte le seguenti voci a ~ / .bash_profile

    export JAVA_HOME=/usr/lib/jvm/java-6-openjdk
    
    export PATH=$PATH:$JAVA_HOME/bin
  3. Salva le modifiche ed esci

  4. Apri di nuovo un terminale e digita quanto segue

    echo $JAVA_HOME   (blank)
    echo $PATH        (displayed, but not the JAVA_HOME value)
  5. Non è successo nulla, come se l'esportazione di JAVA_HOME e la sua aggiunta al PERCORSO non fossero mai state fatte.

Soluzione

Ho dovuto andare su ~ / .bashrc e aggiungere la seguente voce verso la fine del file

#Source bash_profile to set JAVA_HOME and add it to the PATH because for some reason is not being picked up
. ~/.bash_profile

Domande

  1. Perché ho dovuto farlo? Pensavo che bash_profile, bash_login o profile in assenza di quei due venissero eseguiti prima di bashrc.
  2. In questo caso il mio terminale era una shell senza login ?
  3. In tal caso, perché quando si fa su dopo il terminale e si inserisce la password non viene eseguito il profilo dove avevo impostato anche le esportazioni di cui sopra?

Risposte:


224

~/.bash_profileviene fornito da bash solo quando avviato in modalità di accesso interattivo. Questo è in genere solo quando si accede alla console ( Ctrl+ Alt+ F1.. F6) o ci si connette tramite ssh.

Quando esegui l'accesso graficamente, ~/.profileverrà fornito in modo specifico dallo script che avvia gnome-session (o qualsiasi ambiente desktop in uso). Quindi ~/.bash_profilenon proviene affatto quando si accede graficamente.

Quando si apre un terminale, il terminale inizia bash in modalità interattiva (non di accesso), il che significa che verrà sorgente ~/.bashrc.

È il posto giusto in cui inserire queste variabili di ambiente ~/.profilee l'effetto dovrebbe essere evidente al prossimo accesso.

Il sourcing ~/.bash_profileda ~/.bashrcè la soluzione sbagliata. Dovrebbe essere il contrario; ~/.bash_profiledovrebbe fonte ~/.bashrc.

Vedi DotFiles per una spiegazione più approfondita, inclusa una storia del perché è come è.

(In una nota a margine, quando si installa openjdk tramite apt, i collegamenti simbolici dovrebbero essere configurati dal pacchetto, quindi non è necessario impostare JAVA_HOMEo modificare PATH)


6
Ho scoperto che quando si apre un Terminale dalla barra laterale in Ubuntu 12 il file ~ / .profile non viene caricato.
jcollum,

3
@jcollum Va bene. .profiledovrebbe essere acquistato solo al momento del login.
geirha

2
oh, aprire un terminale non è lo stesso del login ... Stavo pensando di fare il login al terminale .
jcollum,

2
Ricorda che .profileviene ignorato da bash se .bash_profileesiste. Vedi la mia risposta qui e man bashper maggiori dettagli.
Terdon

3
@terdon, sì, ma bash non è coinvolto quando si accede graficamente, quindi va dritto per .profile.
geirha,

48

Puoi verificare se la tua shell Bash è avviata come shell di login eseguendo:

shopt login_shell

Se la risposta è offche non si esegue una shell di accesso.

Leggi la sezione di invocazione del manuale di Bash su come Bash legge (o non legge) diversi file di configurazione.

Estratto da man bash:

Quando bash viene invocato come shell di login interattiva o come shell non interattiva con l' --login opzione, legge innanzitutto ed esegue i comandi dal file /etc/profile, se quel file esiste. Dopo aver letto il file, si cerca ~/.bash_profile, ~/.bash_logine ~/.profile, in questo ordine, e legge ed esegue comandi dal primo che esiste ed è leggibile.

sud'altra parte, inoltre, non avvia una shell di login per impostazione predefinita, devi dirglielo usando l' --loginopzione.


9
Grazie mille per il comando shotp login_shell . Eccezionale!!
Viriato,

27

Penso che valga la pena ricordare che è possibile modificare il valore predefinito di gnome-terminal per utilizzare una shell di login (es. Bash -l) modificando le preferenze del profilo.

vai su Modifica -> Preferenze profilo -> scheda Titolo e comando seleziona l'opzione "Esegui comando come shell di accesso"


1
Quali sono gli svantaggi di abilitare questa impostazione?
chrish,

2
@chris in molti casi stai caricando il codice un po 'più del necessario. Probabilmente non importa se stai ~/.bash_profilevalutando molto rapidamente, il che è probabilmente il caso. Una buona cosa da controllare è quella di scacciare qualsiasi chiamata ad altri processi che di solito sono piuttosto costosi.
vaab

14

Se si apre un terminale o si esegue sula shell non viene eseguita come shell di accesso ma come normale shell interattiva. Quindi legge ~/.bashrcma non ~/.bash_profile. È possibile eseguire sucon l' -lopzione per far funzionare la shell come shell di accesso.

Quando si lavora con una GUI, la shell di solito non viene mai eseguita come shell di login, quindi di solito va bene inserire tutto ciò che è possibile ~/.bashrc.


1
Questo è quello che avevo fatto e ha funzionato, ma controlla cosa dice il ragazzo in fondo, suggerisce che è una cattiva idea metterlo in bashrc e invece inserirlo nel profilo. .... Ehi in entrambi i modi funzionano, grazie mille.
Viriato,

4

TL; DR

Nella classica configurazione di Ubuntu consigliata, ~/.bash_profileviene valutata solo in occasioni specifiche. E ha senso.

Metti le tue cose ~/.bashrc, verranno valutate ogni volta.

Ok, voglio capire, perché ha senso?

Punti chiave per capire cosa sta succedendo:

  • tutti i processi su Linux hanno e usano variabili d' ambiente
  • le variabili d'ambiente sono ereditate
  • quindi impostarli una volta sul padre di tutto il tuo processo è sufficiente (specialmente se richiede del tempo di calcolo).
  • il padre di tutto il processo viene in genere avviato dopo aver effettuato l' accesso sul dispositivo (fornire le proprie credenziali).
  • ci sono cose che potresti voler fare solo una volta quando accedi al tuo computer (controlla per esempio la nuova posta ...).

Quindi il tempo di "login" è in genere:

  • In modalità console, quando accedi (con Ctrl-Alt F1) o attraverso ssh, poiché la shell sarà il padre di tutto il processo, caricherà il tuo ~/.bash_profile.
  • In modalità grafica, quando apri la sessione, il primo processo ( gnome-sessionper Ubuntu classica) sarà incaricato di leggere
    .profile.

Ok, quindi dove mettere la mia roba?

È piuttosto complesso, la storia completa è qui . Ma ecco un riassunto che è abbastanza comune per gli utenti di Ubuntu. Quindi considerando che:

  • usi bashshell
  • hai un ~/.bash_profilee segui la raccomandazione di aggiungere il caricamento ~/.bashrcnel tuo in ~/.bash_profilemodo da ottenere almeno un file che viene valutato qualunque sia il meccanismo di invocazione .

Questo è un rapido suggerimento su dove mettere le cose.

  • ~ / .bashrc (viene valutato in tutte le occasioni , a condizione che segua la raccomandazione)

    Per rapida valutazione variabile di ambiente e il codice per il vostro user-only e bash solo utilizzo della riga di comando (alias per esempio). il bashismo è il benvenuto.

    Si carica su se stesso su:

    • crea una nuova finestra / riquadro della shell in sessioni grafiche.
    • chiamata bash
    • screennuovo riquadro o scheda. (no tmux!)
    • qualsiasi istanza bash in un client della console grafica ( terminator/ gnome-terminal...) se non si seleziona l' opzione "esegui comando come shell di accesso".

    E verrà caricato in tutte le altre occasioni grazie alla raccomandazione precedente.

  • ~ / .bash_profile (viene valutato solo in occasioni specifiche )

    Per variabili di ambiente a valutazione lenta e codice per i processi di sola sessione utente e console . il bashismo è il benvenuto. Viene caricato su:

    • accesso alla console (Ctrl-Alt F1),
    • login ssh su questa macchina,
    • tmuxnuovo riquadro o finestre (impostazioni predefinite), (non screen!)
    • chiamate esplicite di bash -l,
    • qualsiasi istanza bash in un client della console grafica ( terminator/ gnome-terminal...) solo se si seleziona l'opzione "esegui comando come shell di accesso".
  • ~ / .profile (viene valutato solo in sessione grafica)

    Per variabili di ambiente a valutazione lenta e senza bashismo per i processi di sola sessione dell'utente e tutti i processi grafici . Viene caricato all'accesso nell'interfaccia grafica.


Nelle occasioni in cui bash carica un file di profilo, verrà caricato .profilese .bash_profilenon esiste.
Muru,

Grazie mille per una chiara spiegazione. aiuta i neofiti come me. In Mac Mojave, se inserisco le variabili in ~ / .bashrc e eseguo il sorgente, e se envlo faccio non vedo le variabili env impostate (ho provato a chiudere iTerm e riaprire). Ma noto che quando ho installato Android Studio e altre app, sono stati impostati tutti quei parametri ambientali /.bash_profile. Quindi quando l'ho aggiunto /.bash_profileha funzionato come un fascino. Perché?
sofs1,
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.