Configura gnome-terminal per avviare bash come shell di login, non legge .bashrc


24

Sto cercando di integrare RVM con gnome-terminal .

Per impostazione predefinita, gnome-terminal non si avvia bash come shell di login. Ho abilitato run command as a login shellcome suggerito in questa risposta sullo stesso argomento di configurazione di RVM, ma quando lo faccio il .bashrcfile non viene letto.

Ad esempio, creo una variabile d'ambiente .bashrce quindi quando avvio un nuovo terminale gnome non riesco a leggerlo. Ho bisogno di correre esplicitamente source .bashrcper leggere il file.

È questo il comportamento previsto?

Risposte:


38

Sì, questo è il comportamento previsto.

Il comportamento, in breve, è il seguente:

  • bash è iniziato come una shell di login interattiva: legge ~/.profile
  • bash è iniziato come una shell interattiva senza accesso: legge ~/.bashrc

Leggi il manuale di bash sui file di avvio per maggiori dettagli.

Personalmente, penso che questo comportamento sia strano e non ho ancora trovato una razionalizzazione per questa decisione progettuale.


Qualche spiegazione della terminologia:

  • Una shell interattiva è una shell con cui è possibile interagire, il che significa che è possibile digitare comandi in essa. La maggior parte delle shell che userete sono shell interattive.
  • Una shell non interattiva è una shell con la quale non è possibile interagire. Gli script di shell vengono eseguiti all'interno di shell non interattive.
  • Una shell di accesso è la shell che viene avviata quando si accede al sistema.
  • Una shell non di accesso è una shell che viene avviata dopo il processo di accesso.

La maggior parte delle shell che vedi sono shell interattive senza accesso . Ciò è particolarmente vero se si esegue un ambiente grafico come gnome, perché allora gnome è la "shell di accesso". Qualsiasi sessione bash avviata all'interno di gnome è una shell non di accesso. Se vuoi vedere una vera shell di login interattiva, vai su una console virtuale (usando Ctrl+Alt+F1) e poi accedi usando il tuo nome utente e password. Questa è una vera shell bash di login interattiva. Puoi tornare alla shell grafica usando Ctrl+Alt+F7.

C'è un'opzione --loginche farà in modo che bash si comporti come se fosse una shell di login anche se avviata dopo aver effettuato l'accesso. Configurare gnome-terminal per avviare bash come shell di login significa che avvierà bash usando l' --loginopzione.


Di solito vuoi che bash legga sempre ~/.bashrcin una shell interattiva. Ecco come ti consiglio di farlo:

Crea un ~/.bash_profilefile. Se bash è iniziato come una shell di login cercherà prima di ~/.bash_profileprima di cercare ~/.profile. Se bash trova, ~/.bash_profileallora non leggerà ~/.profile.

Inserisci le seguenti righe ~/.bash_profile:

[ -f "$HOME/.profile" ] && source "$HOME/.profile"
[ -f "$HOME/.bashrc" ] && source "$HOME/.bashrc"

Ora se bash viene avviato come shell di login interattiva leggerà i seguenti file:

  1. ~/.bash_profile
  2. ~/.profile
  3. ~/.bashrc

e se bash viene avviato come shell interattiva non di accesso:

  1. ~/.bashrc

Dovresti mettere cose che sono specifiche di bash ~/.bashrce cose che non sono specifiche di bash ~/.profile. Ad esempio PATHentra ~/.profilee HISTCONTROLentra ~/.bashrc.

Nota che ~/.profilenon è specifico per Bash. Leggono anche altre shell basate su testo (ad esempio sh o ksh) e shell grafiche (gnome) ~/.profile. Questo è il motivo per cui non dovresti mettere cose specifiche bash ~/.profile.


1
+1. Grazie, questo mi stava facendo salire sul muro ... :-)
richsage l'

1
mywiki.wooledge.org/DotFiles spiega un po 'di storia sul perché è come è. La ragione principale di questo problema con rvm è che rvm inserisce il codice, che è pensato per essere in ~/.bashrcprimo luogo, nel profilo. L'errore è su rvm.
Geirha,

Secondo @geirha avrebbero dovuto usare~/.profile
sanmai

La logica è che lo script del profilo può controllare la valutazione di .bashrcciò che deve fare. Se la shell interattiva .bashrcdovesse sempre leggere, dovrebbe essere prima o dopo .profile? Cosa succede se si desidera impostare alcune cose in .bashrccui dare .profileper scontato? E allo stesso tempo vuoi che alcune cose .bashrcfacciano affidamento su qualcosa creato da .profile? Nessuno dei due ordini di caricamento soddisferà entrambi gli scenari.
Kaz

11

Questa non è né una cattiva decisione di progettazione, né un bug, né un comportamento previsto di shell e terminali

È semplicemente uno sfortunato valore predefinito di un'opzione di configurazione per profilo in Gnome Terminal, che puoi facilmente correggere.

  1. Vai a Modifica -> Preferenze profilo .

  2. Seleziona la scheda Titolo e Comando .

  3. Notare come la casella di controllo Esegui come shell di accesso non è selezionata! Controllalo.

Questo è tutto. Se lo fai sul Defaultprofilo o su qualunque profilo sia configurato per essere utilizzato quando si creano nuovi terminali, si ottiene una shell di accesso.

Immagino che sotto il cofano, questa opzione probabilmente causi il passaggio -ldell'opzione alla shell.


0

Ho avuto la stessa domanda e ho trovato una soluzione: basta usare SSH per una vera shell di login!

1. Come superutente, creare un utente di sistema rvm dedicato per l'isolamento completo e assegnare una password:

sudo su

useradd -m rvmuser

passwd rvmuser

2. Installa le dipendenze in modo che rvm possa creare rubini senza richiedere la password del superutente:

apt-get install curl gawk libreadline6-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 autoconf libgdbm-dev libncurses5-dev automake bison libffi-dev

3. SSH in localhost per una vera shell di login (potrebbe essere necessario apt-get install ssh)

ssh rvmuser@localhost

4. Installa rvm

\curl -sSL https://get.rvm.io | bash -s stable

5. Disconnettersi e riconnettersi in modo da caricare tutte le funzioni rvm

exit

ssh rvmuser@localhost

6. Usa rvm :)


0

È comune quando si utilizza bash per posizionare l'inizializzazione del profilo .bash_profile, che viene letta solo da bash all'accesso, mentre altre shell hanno condiviso storicamente .profile. Questo ti permette di inserire comandi specifici per bash .bash_profile.

L'uso di quanto segue viene comunemente utilizzato per inserire gli alias definiti in .bashrc:

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
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.