La domanda dice tutto. Attualmente uso Arch Linux e zsh, ma mi piacerebbe una soluzione che (almeno) funzioni sia su VT che in xterms e anche (si spera, preferibilmente) continuerà a funzionare se cambio distro o shell.
Ho sentito risposte selvaggiamente disparate a questa domanda nei documenti di diverse distribuzioni. Ubuntu dice "usa .pam_environment". Penso che in Arch ciò che consigliano dipenda dalla tua shell. Attualmente metto tutto in .profile e se una shell non lo fa per qualche motivo (ad esempio bash se esiste .bash_profile), lo sovrascrivo cercandolo manualmente. Ma sembra che ci debba essere un modo migliore.
Risposta accettata:
Sfortunatamente non esiste una posizione completamente portatile per impostare le variabili di ambiente. I due file più vicini sono ~/.profile
, che è la posizione tradizionale e funziona immediatamente su molte configurazioni, e ~/.pam_environment
, un'alternativa moderna, banale ma limitata.
Cosa inserire in ~/.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 principale vantaggio di ~/.pam_environment
è che (se 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 per accessi non interattivi come su -c somecommand
e ssh somecommand
.
La principale limitazione di ~/.pam_environment
è che puoi inserire solo compiti semplici lì, non una sintassi della shell complessa. La sintassi di questo file è la seguente.
- I file vengono analizzati riga per riga.
- Ogni riga deve avere la forma
VAR=VALUE
dove VAR è composto da lettere, cifre e trattini bassi. La forma alternativaVAR DEFAULT=value
consente espansioni di variabili di ambiente utilizzando${VAR}
sintassi e le variabili speciali@{HOME}
e@{SHELL}
. #
avvia un commento, non può apparire in un valore.- Se VALUE è racchiuso tra
"
, quindi VAR viene impostato sulla stringa tra virgolette. $
o@
inserisci un letterale$
o@
e le righe lunghe possono essere divise eseguendo l'escape della nuova riga con un.
- Se c'è un errore di sintassi come no
=
o uno spazio bianco senza virgolette, la variabile viene rimossa dall'ambiente.
Quindi, al rialzo, ~/.pam_environment
funziona in una vasta gamma di circostanze. Sul lato negativo, non è possibile utilizzare l'output di un comando (ad es. verifica se è presente una directory o un programma) e alcuni caratteri (#"
, newline) sono impossibili o fastidiosi da inserire nel valore.
Cosa inserire in ~/.profile
Questo file dovrebbe avere la sintassi sh portatile (POSIX). Usa solo le estensioni ksh o bash (array, [[ … ]]
, ecc.) se sai che il tuo sistema ha queste shell come /bin/sh
.
Questo file può essere letto da script in applicazioni automatizzate, quindi non dovrebbe chiamare programmi che producono alcun output o chiamare exec
. Se vuoi farlo su 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 di utilizzo di /bin/sh
come shell di accesso e passare alla shell preferita. Guarda anche come posso usare bash come shell di accesso quando il mio amministratore di sistema si rifiuta di farmi cambiare
Quando è ~/.profile
non leggi l'accesso non grafico?
Diverse shell di accesso leggono file diversi.
Se la tua 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 mai più ricordare queste stranezze, crea un ~/.bash_profile
con le seguenti due righe:
. ~/.profile
case $- in *i*) . ~/.bashrc;; esac
Se la tua 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. Puoi usarlo per il tuo ~/.zprofile
:
emulate sh -c '. ~/.profile'
Se la tua shell di accesso è un'altra shell
Non c'è molto che puoi fare lì, a parte l'utilizzo di /bin/sh
come shell di accesso e come shell preferita (come il pesce) solo come shell interattiva. Questo è quello che faccio con zsh. Vedi sopra per un esempio di invocare un'altra shell da ~/.profile
.
Comandi remoti
Quando si invoca un comando remoto senza passare attraverso una shell interattiva, non tutte le shell leggono un file di avvio.
Ksh legge il file specificato da ENV
variabile, se riesci a passarla.
Bash legge ~/.bashrc
se non è interattivo (!) e il suo processo padre è chiamato rshd
o sshd
. Quindi puoi avviare il tuo ~/.bashrc
con
if [[ $- != *i* ]]; then
. ~/.profile
return
fi
Zsh legge sempre ~/.zshenv
quando inizia. Usalo con cautela, poiché viene letto da ogni singola istanza di zsh, anche quando è una subshell in cui hai impostato altre variabili. Se zsh è la tua shell di login e vuoi usarla per impostare le variabili solo per i comandi remoti, usa una guardia:imposta qualche variabile in ~/.profile
, come MY_ENVIRONMENT_HAS_BEEN_SET=yes
e controlla questa protezione prima di leggere ~/.profile
.
if [[ -z $MY_ENVIRONMENT_HAS_BEEN_SET ]]; then emulate sh -c '~/.profile'; fi
Il caso degli accessi grafici
Molte distribuzioni, display manager e ambienti desktop si organizzano per eseguire ~/.profile
, acquistandolo esplicitamente dagli script di avvio o eseguendo una shell di accesso.
Sfortunatamente, non esiste un metodo generale per gestire le combinazioni distro/DM/DE in cui ~/.profile
non viene letto.
Se utilizzi una sessione tradizionale avviata da ~/.xsession
, questo è il posto in cui dovresti impostare le tue variabili d'ambiente; fallo cercando ~/.profile
(cioè . ~/.profile
). Nota che in alcune configurazioni, gli script di avvio dell'ambiente desktop genereranno ~/.profile
di nuovo.