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 comeulimit
. - 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]
- Lo stai eseguendo direttamente nel terminale o in uno script?
- 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 è.