Perché il mio ~ / .bash_profile non funziona?


35

Sto usando Linux Mint. La mia shell di login ( cat /etc/passwd | grep myUserName) è bash.

Dopo aver avviato il mio ambiente desktop grafico e aver eseguito un emulatore di terminale da esso, posso vedere che .bash_profilenon proviene (le variabili di ambiente che sono exporteditate in esso non sono impostate). Ma se accedo da una console di testo ( ctrl+ alt+ F1) o eseguo manualmente bash -ldall'emulatore di terminale, .bash_profilefunziona bene.

Sbaglio quando penso che .bash_profiledovrebbe essere di provenienza all'avvio di X e tutti exporti Vars dovrebbero essere disponibili nel terminale, partendo da X?

PS Inserire tutto .bashrce reperirlo da .bash_profilenon è una buona idea ( https://stackoverflow.com/questions/902946/ ): i contenuti ambientali dovrebbero essere acquistati una sola volta.

Risposte:


39

Il file ~/.bash_profileviene letto da bash quando si tratta di una shell di accesso. Questo è ciò che ottieni quando accedi in modalità testo.

Quando accedi sotto X, gli script di avvio vengono eseguiti da /bin/sh. Su Ubuntu e Mint, /bin/shè trattino , non bash. Dash e bash hanno entrambi le stesse funzionalità di base, ma il trattino si attacca a queste funzionalità di base per essere veloce e piccolo, mentre bash aggiunge molte funzionalità a costo di richiedere più risorse. È comune usare dash per gli script che non necessitano delle funzionalità extra e bash per un uso interattivo (sebbene zsh abbia molte funzionalità più interessanti ).

La maggior parte delle combinazioni di display manager (il programma in cui si digita il nome utente e password) e ambiente desktop letto ~/.profiledagli script di login in /etc/X11/Xsession, /usr/bin/lightdm-session, /etc/gdm/Xsessiono seconda dei casi. Quindi inserisci le definizioni delle variabili di ambiente ~/.profile. Assicurati di utilizzare solo la sintassi supportata dal trattino.

Quindi cosa dovresti mettere dove?

  • Un buon .bash_profilecarico .profilee carica .bashrcse la shell è interattiva.

    . ~/.profile
    if [[ $- == *i* ]]; then . ~/.bashrc; fi
  • In .profile, inserisci le definizioni delle variabili di ambiente e altre impostazioni della sessione come ulimit.

  • In .bashrc, inserisci le impostazioni interattive bash come alias, funzioni, completamento, combinazioni di tasti (che non sono presenti .inputrc), ...

Vedi anche Differenza tra Shell di accesso e Shell non di accesso? e alternativa a .bashrc .


1
molte cose apprese dalla singola risposta :)
mtk,

16

.bash_profileè lo script di configurazione di avvio di bash. Non esiste uno standard che impone X alla fonte .bash_profile.

Quello che stai pensando è piuttosto .profile. Inizialmente era il file di configurazione di avvio della shell bourne (sh). Oggi molte distribuzioni hanno il loro ambiente desktop impostato sul sorgente .profile. Si noti che anche questo non è uno standard, ma sembra essere una convenzione.

Debian era solito .profileaccedere al login grafico ( pagina wiki dal 2013 ) ora non lo fa ( pagina wiki dal 2016 ).

Arch archivia .xprofileal login grafico ( pagina wiki dal 2013 ).

Ubuntu era solito scoraggiare l'utilizzo .profile( pagina wiki a partire dal 2013 ) ora non si scoraggia più ( pagina wiki a partire dal 2016 ).


Per quanto riguarda l'altra tua domanda: perché il mio ~ / .bash_profile non funziona? 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 non di accesso: legge ~/.bashrc

Per maggiori dettagli vedi la mia risposta a una domanda simile in askubuntu: https://askubuntu.com/questions/132276/configure-gnome-terminal-to-start-bash-as-a-login-shell-doesnt-read-bashrc / 132.319 # 132319


1
Alcuni di questi sono corretti, ma "leggere sempre ~/.bashrc" è un cattivo consiglio: dovresti leggere solo .bashrcda una shell interattiva . Qui hai perso il problema principale che è che quando si accede sotto X, non esiste un'istanza di accesso di bash (nella maggior parte delle combinazioni di display manager / ambiente desktop, incluso evidentemente quello di AntonioK).
Gilles 'SO- smetti di essere malvagio' il

Grazie per il tuo feedback. Spero di aver aggiornato la mia risposta abbastanza bene per risolvere i tuoi reclami. Per quanto riguarda il mio consiglio di "leggere sempre .bashrc", intendevo sempre per una shell interattiva. Ho chiarito quella parte. Spero non sia più fuorviante.
lesmana,

2
" Ubuntu scoraggia specificamente usando .profile( link ) " Il wiki una volta (assurdamente) lo ha scoraggiato; è stato risolto. (La nota /etc/profilerimane sconsigliata per le assegnazioni a livello di sistema, preferibilmente per l'aggiunta di script a /etc/profile.d.) I .profilefile per utente sono ora presentati come uno dei modi consigliati per impostare le variabili di ambiente per utente: "File adatti per le impostazioni delle variabili di ambiente che dovrebbero interessare solo un utenti particolari (piuttosto che l'intero sistema) sono ~ / .pam_environment e ~ / .profile . "
Eliah Kagan,

La pagina collegata su Debian specifica che Debian non legge ~/.profileper l'accesso grafico e ~/.xsessionrcdeve essere usata al suo posto.
karora,

grazie per averlo notato. la pagina wiki è stata aggiornata. mi sono collegato alle versioni come erano al momento della risposta.
lesmana,

2

Nella tua domanda, fai riferimento a https://stackoverflow.com/questions/902946/ come a raccomandare di non fonte, quando la risposta accettata prescrive a

  • Metti il ​​mio setup PATH in un file .profile (perché a volte uso altre shell)
  • Inserisci i miei alias e funzioni Bash nel mio file .bashrc
  • Quindi usa questo [EDITED: snip code-commenti]:

    .bash_profile:

    #!/bin/bash
    # echo "Loading ${HOME}/.bash_profile"
    source ~/.profile # Get the paths
    source ~/.bashrc  # get aliases

Inserire tutto .profilenon ha funzionato per me su Linux Mint. Usando ha .bashrcfunzionato bene.


2

Un paio di problemi sorgono quando si tenta di ricaricare il file / source ~ / .profile. [Questo si riferisce a Ubuntu Linux - in alcuni casi i dettagli dei comandi saranno diversi]

  1. Lo stai eseguendo direttamente nel terminale o in uno script?
  2. Come si esegue questo in uno script?

Anno Domini. 1)

Eseguirlo direttamente nel terminale significa che non ci sarà alcuna subshell creata. Quindi puoi usare due comandi:

source ~/.bash_profile

o

. ~/.bash_profile

In entrambi i casi questo aggiornerà l'ambiente con il contenuto del file .profile.

Annuncio 2) Puoi iniziare qualsiasi script bash chiamando

sh myscript.sh 

o

. myscript.sh

Nel primo caso ciò creerà una subshell che non influirà sulle variabili di ambiente del sistema e saranno visibili solo al processo della subshell. Dopo aver terminato il comando subshell nessuna delle esportazioni ecc. Verrà applicata. QUESTO È UN ERRORE COMUNE E CAUSA MOLTI SVILUPPI PER PERDERE MOLTO TEMPO.

Affinché le modifiche applicate nello script abbiano effetto per l'ambiente globale con cui lo script deve essere eseguito

.myscript.sh

comando.

Per assicurarsi che lo script non sia eseguito in un subshel ​​è possibile utilizzare questa funzione. (Ancora un esempio è per la shell Ubuntu)

#/bin/bash

preventSubshell(){
  if [[ $_ != $0 ]]
  then
    echo "Script is being sourced"
  else
    echo "Script is a subshell - please run the script by invoking . script.sh command";
    exit 1;
  fi
}

Spero che questo cancelli alcuni dei malintesi comuni! : D Buona fortuna!


0

La soluzione semplice è rendere il terminale un terminale di accesso. Per il terminale Gnome in "Affianca e comando" del profilo predefinito è possibile selezionare la casella "Esegui comando come shell di accesso". Questo articolo spiega la differenza tra una shell di accesso e quella che non lo è.

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.