(questo è probabilmente eccessivo, ma forse sarà utile)
Alcune cose da tenere a mente:
Le variabili d'ambiente sono un po 'pubblica, e può essere visto da altri processi con la stessa facilità con cui è stata aggiunta un'opzione al comando ps(1)
(come ps e $$
in bash) o guardando allo /proc/*/environ
, sebbene entrambi siano limitati almeno allo stesso utente (o root) sui sistemi moderni. Non fare affidamento sulla loro segretezza se hai un'altra opzione abbastanza facile disponibile.
~/.bashrc
è il posto sbagliato per le variabili di ambiente, dal momento che possono essere calcolate una volta al login in ~/.bash_login
, ~/.bash_profile o ~/.profile
, a seconda del loro utilizzo, e superato verso il basso per tutte le shell discendenti. Al contrario, le azioni ~/.bashrc
tendono a essere ricalcolate su ogni invocazione di shell (se non esplicitamente disabilitato).
Mettere codice bash nel ~/.profile
può confondere altre shell sh-discendenti e gli strumenti non-shell che cercano di leggere il file, in modo da avere la ~/.bash_login
o -_profile contengono le cose specifiche per bash, e usando . ~/.profile
per specifici bash le cose più generali (LESS, EDITOR, VISUAL, LC_COLLATE, LS_COLORS, ecc.) sono più amichevoli con gli altri strumenti.
Le variabili di ambiente in ~/.profile
devono essere nel vecchio formato di shell Bourne (VAR=value ; export VAR
). Su Linux questo non è solitamente critico, anche se su Unixen questo può essere un grosso problema quando una versione precedente di "sh" cerca di leggerli.
Alcune sessioni X leggeranno solo ~/.profile
, non ~/.bash_login
o le altre sopra menzionate. Alcuni cercheranno un file ~/.xsession
che dovrà essere modificato per avere . $HOME/.profile
se non lo è già in qualche modo.
Le impostazioni a livello di sistema vengono invece inserite in qualcosa come /etc/profile.d/similar-to-heroku.sh
. Si noti che ".sh" è presente solo perché il file verrà utilizzato con "." o "source" - gli script di shell dovrebbero mai avere estensioni di nome comando in qualsiasi forma di Unix/Linux.
La maggior parte delle variabili di ambiente viene interrotta quando uno sudo
s esegue il root, come indicato da ybakos. Problemi simili si presentano in crontabs, lavori, ecc. In caso di dubbio, aggiungere env | sort > /tmp/envvars
o uno script sospetto può davvero aiutare nel debug.
Tenere presente che alcune distribuzioni hanno script di avvio della shell così contorti che finiscono per sfidare effettivamente l'ordine indicato nella pagina di manuale di bash (1). Ogni volta che trovi un utente predefinito con controllo ~/.profile
per $ BASH o $ BASH_VERSION, potresti trovarti in uno di questi, um ..., ambienti "interessanti" e potrebbe doverli leggere per capire dove va il flusso di controllo (essi dovrebbe usare uno specifico bash ~/.bash_profile
o ~/.bash_login
, che include il più generico ~/.profile
come riferimento, facendo in modo che l'eseguibile bash faccia il lavoro invece di dover scrivere i controlli $ BASH nel codice della shell).
~/.bash_profile
(o ~/.bash_login
) può certamente comprendere . ~/.bashrc
, ma le variabili di ambiente appartengono nel ~/.bash_profile
(se specifici bash) o il ~/.profile
incluso da esso (se si sta utilizzando questo meccanismo e hanno envvars per tutto il resto in là) come dice DeWitt, ricorda di mettere il . ~/.bashrc
DOPO il.bash_profile's . ~/.profile
e altre variabili di ambiente, in modo che sia il login che tutte le altre chiamate di ~/.bashrc
possono fare affidamento sugli envar già impostati. Un esempio ~/.bash_profile
:
# .bash_profile
[ -r ~/.profile ] && . ~/.profile # envvars
[ -r ~/.bashrc ] && . ~/.bashrc # functions, per-tty settings, etc.
#---eof
I [ -r ... ] && ...
opere in qualsiasi shell Bourne discendente e non causa errori/interrompe se .profile manca (personalmente ho un setup ~/.profile.d/*.sh
pure, ma questo viene lasciata come interamente esercizio facoltativo).
Si noti che bash legge solo il primo file di questi tre che trova:
~/.bash_profile
~/.bash_login
~/.profile
... così una volta che avete che uno, l'uso degli altri due è interamente sotto il controllo dell'utente, dalla prospettiva di bash.
dovesse accadere un account di accesso dopo un riavvio, quando nginx è avviato da uno script rc.d? –