Perché ' il mio ~ / .bash_profile non funziona?

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

Dopo aver avviato il mio ambiente desktop grafico ed eseguito un emulatore di terminale da esso, posso vedere che .bash_profile non è originato (variabili di ambiente che sono export ed in esso non sono impostati). Ma se accedo da una console di testo ( ctrl + alt + F1 ) o eseguo manualmente bash -l dallemulatore di terminale, .bash_profile funziona bene.

Mi sbaglio quando penso che .bash_profile dovrebbe avere origine allavvio di X e tutte le export “ed var dovrebbero essere disponibili nel terminale, partendo da X?

PS Posizionare tutto in .bashrc e prelevarlo da .bash_profile non è una buona idea ( https://stackoverflow.com/questions/902946/ ): il materiale per lambiente deve essere recuperato solo una volta.

Risposta

Il file ~/.bash_profile viene letto da bash quando è una shell di login. Questo è ciò che ottieni quando accedi in modalità testo.

Quando accedi in X, gli script di avvio vengono eseguiti da /bin/sh. Su Ubuntu e Nuovo, /bin/sh è trattino , non bash. Trattino e bash hanno entrambi le stesse caratteristiche principali, ma il trattino rimane queste funzionalità principali per essere veloci e piccole mentre bash aggiunge molte funzionalità al costo di richiedere più risorse .È comune usare il trattino per gli script che non necessitano delle funzionalità extra e bash per luso interattivo (sebbene zsh ha molte funzioni più interessanti ).

La maggior parte delle combinazioni di display manager (il programma in cui digiti il nome utente e la password) e lambiente desktop leggono ~/.profile dagli script di accesso in /etc/X11/Xsession, /usr/bin/lightdm-session, /etc/gdm/Xsession o qualunque sia applicabile. Quindi inserisci le definizioni delle tue variabili di ambiente in ~/.profile. Assicurati di utilizzare solo la sintassi supportata dal trattino.

Quindi cosa dovresti mettere dove?

  • Un buon .bash_profile carica .profile e carica .bashrc se la shell è interattiva.

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

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

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

Commenti

  • molte cose apprese da una singola risposta: )
  • anche .profile ‘ non funziona in Debian 10 ” Buster “, solo .bashrc wor ks

Risposta

.bash_profile è lo script di configurazione di avvio di bash. Non esiste uno standard che imponga a X di generare .bash_profile.

Quello a cui stai pensando è piuttosto .profile. In origine era il file di configurazione di avvio della shell bourne (sh). Oggi molte distribuzioni hanno il loro ambiente desktop configurato come sorgente .profile. Notare che anche questo non è uno standard, ma sembra essere una convenzione.

Debian era solita generare .profile allaccesso grafico ( pagina wiki del 2013 ) ora non” t ( pagina wiki del 2016 ).

Arch sources .xprofile allaccesso grafico ( pagina wiki del 2013 ).

Ubuntu scoraggiava luso di .profile ( pagina wiki del 2013 ) ora non scoraggia più ( pagina wiki del 2016 ).


Riguardo allaltra 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: reads ~/.profile
  • bash è iniziato come una shell interattiva non di accesso: legge ~/.bashrc

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

Commenti

  • In parte è corretto, ma” leggi sempre ~/.bashrc “è un cattivo consiglio: dovresti leggere solo .bashrc da una shell interattiva .’ ti sei perso il problema principale qui che è che quando accedi sotto X, non cè istanza di login di bash (nella maggior parte delle combinazioni di display manager / ambiente desktop, incluso evidentemente AntonioK ‘ s).
  • 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 ” leggi sempre .bashrc “, intendevo sempre per una shell interattiva . Ho chiarito quella parte. Spero che non sia più fuorviante.
  • Ubuntu scoraggia in modo specifico lutilizzo di .profile ( link ) ” Il wiki una volta (assurdamente) lo scoraggiava; che ‘ è stato risolto. (Nota /etc/profile rimane sconsigliato per gli incarichi a livello di sistema, preferendo aggiungere script a /etc/profile.d.) 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 particolare utente ( piuttosto che il sistema nel suo insieme) sono ~ / .pam_environment e ~ / .profile . ”
  • La pagina collegata su Debian specifica che Debian non legge ~/.profile per il login grafico e ~/.xsessionrc dovrebbe essere usato invece.
  • grazie per averlo notato. la pagina wiki è stata aggiornata. ho collegato le versioni così come erano al momento della risposta.

Risposta

Un paio di problemi sorgono quando cercando 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 fa lo esegui in uno script?

Ad. 1)

Eseguire questo direttamente nel terminale significa che non verrà creata alcuna subshell. Quindi puoi utilizzare uno dei due comandi:

source ~/.bash_profile 

o

. ~/.bash_profile 

In entrambi i casi questo aggiornerà lambiente con il contenuto del file .profile.

Annuncio 2) Puoi avviare qualsiasi script bash chiamando

sh myscript.sh 

o

. myscript.sh 

Nel primo caso questo creerà una subshell che non influenzerà le variabili dambiente di il tuo sistema e saranno visibili solo al processo subshell. Dopo aver terminato il comando subshell, nessuna delle esportazioni ecc. Verrà applicata. QUESTO È UN ERRORE COMUNE E FA PERDERE MOLTO TEMPO A MOLTI SVILUPPATORI.

Affinché le modifiche applicate nello script abbiano effetto per lambiente globale lo script deve essere eseguito con il comando

.myscript.sh 

.

Per assicurarsi che lo script non venga eseguito in una sottoshel è possibile utilizzare questa funzione. (Anche in questo caso lesempio è per la shell di 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!

Risposta

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

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

    .bash_profile:

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

Mettere tutto in .profile ha fatto non funziona per me su Linux Mint. Lutilizzo di .bashrc ha funzionato bene.

Risposta

La soluzione semplice è rendere terminale un terminale di accesso. Per il terminale Gnome sotto “Tile and Command” del profilo predefinito puoi selezionare la casella “Run command as a login shell”. Questo articolo spiega la differenza tra una shell di accesso e una che non lo è.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *