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

141

Problema

Possiedo 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 l'aggiunta al PATH non fossero mai state eseguite.

Soluzione

Ho dovuto andare a ~ / .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é dovevo farlo? Ho pensato che bash_profile, bash_login o profilo in assenza di questi due vengono eseguiti prima di bashrc.
  2. In questo caso il mio terminale era una shell non-login ?
  3. Se è così, perché quando si fa su dopo il terminale e si mette la password non si esegue il profilo dove ho anche impostato le esportazioni sopra menzionate?
posta Viriato 11.04.2012 - 18:27

5 risposte

191

~/.bash_profile è originato solo da bash quando avviato in modalità di accesso interattivo. Questo di solito avviene solo quando si effettua il login sulla console ( Ctrl + Alt + F1 .. F6 ), o collegamento via ssh.

Quando accedi graficamente, ~/.profile sarà specificamente creato dallo script che avvia gnome-session (o qualsiasi ambiente desktop che stai usando). Pertanto ~/.bash_profile non viene affatto eseguito quando si accede graficamente.

Quando apri un terminale, il terminale inizia a bash in modalità interattiva (non di accesso), il che significa che genererà ~/.bashrc .

Il posto giusto per mettere queste variabili d'ambiente è in ~/.profile , e l'effetto dovrebbe essere evidente la prossima volta che effettui il login.

Sourcing ~/.bash_profile da ~/.bashrc è la soluzione sbagliata. Dovrebbe essere il contrario; ~/.bash_profile dovrebbe sorgente ~/.bashrc .

Vedi DotFiles per una spiegazione più approfondita, includendo alcune cronologia del perché è come è.

(Nota a margine, quando si installa openjdk tramite apt, i pacchetti di collegamenti simbolici dovrebbero essere impostati in modo tale che non sia veramente necessario impostare JAVA_HOME o modificare PATH )

    
risposta data geirha 11.04.2012 - 18:41
42

Puoi controllare se la tua shell Bash è stata avviata come shell di accesso eseguendo:

shopt login_shell

Se la risposta è off non stai eseguendo una shell di login.

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

Estratto da man bash :

% Bl0ck_qu0te%

su d'altra parte inoltre non avvia una shell di login per impostazione predefinita, devi dirgli di farlo utilizzando l'opzione --login .

    
risposta data lgarzo 11.04.2012 - 18:59
22

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

vai a Modifica - & gt; Preferenze profilo - & gt; Scheda Titolo e comando seleziona l'opzione "Esegui comando come shell di accesso"

    
risposta data kisoku 22.06.2013 - 02:23
14

Se apri un terminale o esegui su la shell non viene eseguita come shell di login ma come normale shell interattiva. Quindi legge ~/.bashrc ma non ~/.bash_profile . Puoi eseguire su con l'opzione -l per fare in modo che esegua la shell come shell di login.

Quando lavori con una GUI, la shell di solito non viene mai eseguita come shell di login, quindi di solito è bene mettere tutto in ~/.bashrc .

    
risposta data Florian Diesch 11.04.2012 - 18:43
1

TL; DR

Nella classica configurazione di ubuntu raccomandata, ~/.bash_profile viene valutata solo in occasioni specifiche. E ha senso.

Metti i tuoi contenuti in ~/.bashrc , verrà valutato ogni volta.

Ok, voglio capire, perché ha senso?

Punti chiave per capire cosa sta succedendo:

  • tutti i processi su linux hanno e utilizza l'ambiente variabili
  • le variabili di ambiente sono ereditate
  • quindi impostarli una volta sul padre di tutto il tuo processo è sufficiente (specialmente se richiede un certo tempo di calcolo.)
  • il padre di tutto il tuo processo viene in genere lanciato dopo di te accedi sul tuo dispositivo (fornisci le tue credenziali).
  • ci sono cose che potresti voler fare una sola volta quando effettui il login il tuo computer (controlla la nuova posta per esempio ...).

Quindi l'orario di "accesso" è in genere:

  • In modalità console, quando esegui l'accesso (con Ctrl-Alt F1) o tramite ssh , poiché la shell sarà il padre di tutto il processo, caricherà il tuo % Co_de%.
  • In modalità grafica, quando apri la sessione, il primo processo ( ~/.bash_profile per ubuntu classica) sarà responsabile della lettura di gnome-session .

Ok, quindi dove mettere le mie cose?

È piuttosto complesso, la storia completa è qui . Ma qui è una corsa verso il basso questo è abbastanza comune per gli utenti di Ubuntu. Quindi, considerando che:

  • usi .profile shell,
  • hai un bash e segui la raccomandazione da aggiungere il caricamento di ~/.bash_profile nel tuo ~/.bashrc in modo da ottenere almeno un file che viene valutato qualunque sia l'invocazione mecanism .

Questo è un rapido suggerimento su dove mettere le cose.

  • ~ / .bashrc (ottiene valutato in ogni occasione , a patto che tu segua la raccomandazione)

    Per la variabile d'ambiente valutazione rapida e il codice per il tuo solo e solo bash di utilizzo della riga di comando (alias per esempio). bashism sono i benvenuti.

    Viene caricato su se stesso su:

    • crea una nuova finestra / pannello di shell in sessioni grafiche.
    • chiama ~/.bash_profile
    • bash nuovo riquadro o scheda. (non screen !)
    • qualsiasi istanza di bash in un client grafico della console ( tmux / terminator ...) se non spunta opzione "esegui comando come shell di login".

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

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

    Per la variabile di ambiente valutazione lenta e il codice per i tuoi processi solo utente e sessione della console . bashism sono i benvenuti. Viene caricato su:

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

    Per le variabili di ambiente valutazione lenta e con no-bashism per i tuoi processi solo utente e tutti per sessioni grafiche . Ottiene caricato al login nella tua interfaccia grafica.

risposta data vaab 08.03.2018 - 04:58

Leggi altre domande sui tag