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


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

Soluzione

Dovevo 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. Era in questo caso il mio terminale a non di login conchiglia?
  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?

138
2018-04-11 16:27


origine


Bella soluzione Ho appena risolto il mio problema! - Atlas7


risposte:


~/.bash_profile è originato solo da bash quando avviato in modalità di accesso interattivo. Questo di solito è solo quando accedi alla console (Ctrl+alt+F1..F6), o la connessione tramite ssh.

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

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

È il posto giusto dove mettere queste variabili d'ambiente ~/.profilee l'effetto dovrebbe essere evidente la prossima volta che effettui il login.

Reperimento ~/.bash_profile a partire dal ~/.bashrc è la soluzione sbagliata. Dovrebbe essere il contrario; ~/.bash_profile dovrebbe fonte ~/.bashrc.

Vedere dotfile per una spiegazione più approfondita, includendo una parte del motivo per cui è come è.

(Nota a parte, quando si installa openjdk tramite apt, i pacchetti simbolici dovrebbero essere configurati tramite symlink, in modo che non sia necessario impostare JAVA_HOME o cambiare PATH)


183
2018-04-11 16:41



Ho scoperto che quando si apre un Terminale dalla barra laterale in Ubuntu 12 il file ~ / .profile non è caricato. - jcollum
@ jcollum Va bene. .profile dovrebbe essere originato solo quando si accede. - geirha
oh, aprire un terminale non è lo stesso di accedere ... Stavo pensando di accedere al terminale. - jcollum
Lo so, è per questo che ho aggiunto il mio codice aggiuntivo lì. Quello che volevo fare era configurare le opzioni per il terminale (ad es. Il prompt), ma queste non erano state caricate se le ho impostate su .profile, anche dopo un riavvio completo. - Juan A. Navarro
@dondon, sì, ma bash non è coinvolto quando si accede graficamente, quindi va dritto per .profile. - geirha


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

shopt login_shell

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

Leggi i manuali di Bash invocazione sezione su come Bash legge (o non legge) diversi file di configurazione.

Estratto da man bash:

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

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


40
2018-04-11 16:59



Grazie mille per il shotp login_shell comando. Eccezionale!! - Viriato
Prego! Btw. in cambio ho imparato molto sfogliando la pagina man di Bash mentre cercavo la tua risposta. :) - lgarzo


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 -> Preferenze profilo -> scheda Titolo e comando selezionare l'opzione "Esegui comando come shell di login"


22
2018-06-22 00:23



Semplice suggerimento per risolvere il problema. Esattamente quello che stavo cercando, grazie. - Jose Torres
Quali sono gli svantaggi di abilitare questa impostazione? - chrish
@rishi stai caricando il codice un po 'più di codice del necessario in molte occasioni. Probabilmente non importa se il tuo ~/.bash_profile sta valutando molto rapidamente, il che probabilmente è il caso. Una buona cosa da controllare è dare una caccia a qualsiasi chiamata ad altri processi che sono in genere piuttosto costosi. - vaab


Se apri un terminale o corri su la shell non viene eseguita come shell di login ma come normale shell interattiva. Così legge ~/.bashrc ma no ~/.bash_profile. Puoi correre su con il -l opzione per far funzionare la shell come shell di login.

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


13
2018-04-11 16:43



Questo è quello che ho fatto e ha funzionato, ma controlla quello che dice il tizio in fondo, è una cattiva idea metterlo in bashrc e metterlo sul profilo. .... Ehi, entrambe le cose funzionano, grazie mille. - Viriato


TL; DR

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

Metti le tue cose dentro ~/.bashrc, verrà valutato ogni volta.

Ok, voglio capire, perché ha senso?

Keypoints per capire cosa sta succedendo:

  • tutti processi su Linux hanno e usa l'ambiente variabili
  • le variabili ambientali sono ereditato
  • quindi impostandoli 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 accesso sul tuo dispositivo (fornisci le tue credenziali).
  • ci sono cose che potresti voler fare una sola volta quando accedi il tuo computer (controlla la nuova posta per esempio ...).

Quindi il tempo di "accesso" è in genere:

  • In modalità console, quando si effettua l'accesso (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-session per ubuntu classica) sarà responsabile della lettura
    .profile.

Ok, quindi dove mettere le mie cose?

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

  • usate bash conchiglia,
  • hai un ~/.bash_profile e segui il raccomandazione aggiungere il caricamento di ~/.bashrc nel tuo ~/.bash_profile 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  (Prende valutato in ogni occasione, a condizione di seguire la raccomandazione)

    Per fast-valutazione variabile d'ambiente e codice per il tuo user-only e bash-only uso da riga di comando (alias per esempio). da bash prego.

    Viene caricato su se stesso su:

    • crea una nuova finestra / pannello di shell in sessioni grafiche.
    • chiamata bash
    • screen nuovo pannello o scheda. (non tmux !)
    • qualsiasi istanza bash in un client grafico della console (terminator/gnome-terminal...) se tu non spuntare  opzione "Esegui comando come shell di login".

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

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

    Per slow-valutazione variabile d'ambiente e codice per il tuo user-only e console-session processi. da bash prego. Viene caricato su:

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

    Per slow-valutazione variabili di ambiente e con no-da bash per il tuo user-only e tutto grafica-session processi. Ottiene caricato all'accesso nell'interfaccia grafica dell'utente.


1
2018-03-08 03:58



Nelle occasioni in cui bash carica un file di profilo, verrà caricato .profile Se .bash_profile non esiste. - muru