Purtroppo non esiste una posizione completamente portatile per impostare le variabili di ambiente. I due file che si avvicinano sono ~/.profile
: la posizione tradizionale e pronta all'uso su molte configurazioni e ~/.pam_environment
, un'alternativa moderna, banale ma limitata.
Cosa mettere ~/.pam_environment
Il file ~/.pam_environment
viene letto da tutti i metodi di accesso che utilizzano PAM e che hanno questo file abilitato. Questo copre la maggior parte dei sistemi Linux al giorno d'oggi.
Il vantaggio principale ~/.pam_environment
è che (quando abilitato) viene letto prima dell'avvio della shell dell'utente, quindi funziona indipendentemente dal tipo di sessione, dalla shell di accesso e da altre complessità. Funziona anche con accessi non interattivi come su -c somecommand
e ssh somecommand
.
Il limite principale di ~/.pam_environment
è che puoi solo inserire compiti semplici lì, non sintassi complessa della shell. La sintassi di questo file è la seguente.
- I file vengono analizzati riga per riga.
- Lo spazio bianco principale viene ignorato.
- Puoi facoltativamente iniziare le linee con
export
e un singolo spazio (non una scheda, vai a figura).
- Successivamente, ogni riga deve avere la forma in
VAR=VALUE
cui VAR è composto da lettere, cifre e caratteri di sottolineatura.
#
inizia un commento, non può apparire in un valore.
- Se VALUE inizia con
'
o "
e contiene un'altra virgoletta identica, VAR viene impostato sulla stringa tra virgolette (tutto ciò che segue la seconda virgoletta viene ignorato). Altrimenti VAR è impostato sulla stringa dopo il =
segno.
- In caso contrario
=
, la variabile viene rimossa dall'ambiente.
Quindi, al rialzo, ~/.pam_environment
funziona in una vasta gamma di circostanze. Sul lato negativo, non è possibile avere impostazioni dinamiche come basare il valore di una variabile su un'altra variabile (ad esempio aggiungendo una directory a PATH) o usare l'output di un comando (ad esempio test se è presente una directory o un programma), e alcuni i caratteri ( #'"
, newline) sono impossibili o problematici da inserire nel valore.
Cosa mettere ~/.profile
Questo file dovrebbe avere una sintassi sh portatile (POSIX). Usa le estensioni ksh o bash (array, [[ … ]]
ecc.) Solo se sai che il tuo sistema ha queste shell come /bin/sh
.
Questo file può essere letto da script in applicazioni automatizzate, quindi non deve chiamare programmi che producono output o chiamate exec
. Se vuoi farlo sugli accessi in modalità testo, fallo solo per shell interattive. Esempio:
case $- in *i*)
# Display a message if I have new mail
if mail -e; then echo 'You have new mail'; fi
# If zsh is available, and this looks like a text-mode login, run zsh
case "`ps $PPID` " in
*" login "*)
if type zsh >/dev/null 2>/dev/null; then exec zsh; fi;;
esac
esac
Questo è un esempio dell'uso /bin/sh
della shell di login e del passaggio alla shell preferita. Vedi anche come posso usare bash come shell di login quando il mio amministratore di sistema rifiuta di farmi cambiare
Quando ~/.profile
non viene letto su login non grafico?
Diverse shell di login leggono file diversi.
Se la shell di accesso è bash
Bash legge ~/.bash_login
o ~/.bash_profile
se esistono invece di ~/.profile
. Inoltre bash non legge ~/.bashrc
in una shell di login anche se è interattiva. Per non dover più ricordare queste stranezze, crea un ~/.bash_profile
con le seguenti due righe:
. ~/.profile
case $- in *i*) . ~/.bashrc;; esac
Vedi anche Quali file di installazione dovrebbero essere usati per impostare le variabili d'ambiente con bash?
Se la shell di accesso è zsh
Zsh legge ~/.zprofile
e ~/.zlogin
, ma non ~/.profile
. Zsh ha una sintassi diversa da sh, ma può leggere ~/.profile
in modalità di emulazione sh. Puoi usarlo per il tuo ~/.zprofile
:
emulate sh -c '. ~/.profile'
Vedi anche Zsh che non colpisce ~ / .profile
Se la shell di accesso è un'altra shell
Non c'è molto che puoi fare lì, a meno di usarlo /bin/sh
come shell di accesso e la tua shell preferita (come il pesce) solo come shell interattiva. Questo è quello che faccio con zsh. Vedi sopra per un esempio di invocazione di un'altra shell da ~/.profile
.
Comandi remoti
Quando si richiama un comando remoto senza passare attraverso una shell interattiva, non tutte le shell leggono un file di avvio.
Ksh legge il file specificato dalla ENV
variabile, se riesci a passarlo.
Bash legge ~/.bashrc
se non è interattivo (!) E il suo processo genitore viene chiamato rshd
o sshd
. Quindi puoi iniziare ~/.bashrc
con
if [[ $- != *i* ]]; then
. ~/.profile
return
fi
Zsh legge sempre ~/.zshenv
quando inizia. Usare con cautela, poiché questo viene letto da ogni singola istanza di zsh, anche quando si tratta di una subshell in cui sono state impostate altre variabili. Se zsh è la tua shell di login e vuoi usarla per impostare le variabili solo per i comandi remoti, usa un guard: imposta qualche variabile in ~/.profile
, come MY_ENVIRONMENT_HAS_BEEN_SET=yes
, e controlla questo guard prima di leggere ~/.profile
.
if [[ -z $MY_ENVIRONMENT_HAS_BEEN_SET ]]; then emulate sh -c '~/.profile'; fi
Il caso degli accessi grafici
Molte distribuzioni, gestori di display e ambienti desktop si organizzano per l'esecuzione ~/.profile
, sia approvvigionandolo esplicitamente dagli script di avvio o eseguendo una shell di accesso.
Sfortunatamente, non esiste un metodo generale per gestire combinazioni distro / DM / DE dove ~/.profile
non viene letto.
Se si utilizza una sessione tradizionale avviata da ~/.xsession
, questo è il luogo in cui è necessario impostare le variabili di ambiente; farlo acquistando ~/.profile
(cioè . ~/.profile
). Si noti che in alcune configurazioni, gli script di avvio dell'ambiente desktop verranno ~/.profile
nuovamente generati .