Dov'è il posto preferito per impostare PATH
envvar?
~/.profile
o /etc/environment
?
Qual è il caso in cui PATH
è impostato in entrambi i luoghi? Il risultato finale è una concatenazione di entrambi i valori impostati in quei due posti?
Dov'è il posto preferito per impostare PATH
envvar?
~/.profile
o /etc/environment
?
Qual è il caso in cui PATH
è impostato in entrambi i luoghi? Il risultato finale è una concatenazione di entrambi i valori impostati in quei due posti?
Risposte:
Sommario:
Se vuoi aggiungere un percorso (es. /your/additional/path
) PATH
Alla tua variabile solo per il tuo attuale utente e non per tutti gli utenti del tuo computer, normalmente lo metti alla fine ~/.profile
come in uno di questi due esempi:
PATH="/your/additional/path:$PATH"
PATH="$PATH:/your/additional/path"
Nota che le priorità del percorso scendono da sinistra a destra, quindi il primo percorso ha la priorità più alta. Se aggiungi il tuo percorso a sinistra di $PATH
, avrà la priorità più alta e gli eseguibili in quella posizione avranno la precedenza su tutti gli altri. Se aggiungi il tuo percorso sulla destra, avrà la priorità più bassa e saranno preferibili gli eseguibili delle altre posizioni.
Tuttavia, se è necessario impostare quella variabile di ambiente per tutti gli utenti, non consiglierei comunque di toccare /etc/environment
ma di creare un file con il nome del file che termina .sh
con /etc/profile.d/
. Lo /etc/profile
script e tutti gli script in /etc/profile.d
sono l'equivalente globale di ogni utente personale ~/.profile
ed eseguiti come script shell regolari da tutte le shell durante la loro inizializzazione.
Più dettaglio:
/etc/environment
è un file di configurazione a livello di sistema, il che significa che viene utilizzato da tutti gli utenti. È di proprietà di root
però, quindi devi essere un utente amministratore e usarlo sudo
per modificarlo.
~/.profile
è uno degli script di inizializzazione della shell personale dell'utente. Ogni utente ne ha uno e può modificare il proprio file senza influire sugli altri.
/etc/profile
e /etc/profile.d/*.sh
sono gli script di inizializzazione globale equivalenti a ~/.profile
per ciascun utente. Gli script globali vengono eseguiti prima degli script specifici dell'utente; e il main /etc/profile
esegue tutti gli *.sh
script /etc/profile.d/
appena prima di uscire.
Il /etc/environment
file normalmente contiene solo questa riga:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
Imposta la PATH
variabile per tutti gli utenti del sistema su questo valore predefinito, che non deve essere modificato in modo rilevante. Almeno non si dovrebbe rimuovere i percorsi importanti come /bin
, /sbin
, /usr/bin
e /usr/sbin
da esso.
Questo file viene letto come uno dei primi file di configurazione da ogni shell di ogni utente. Si noti che non è uno script di shell . È solo un file di configurazione che viene analizzato in qualche modo e che può contenere solo assegnazioni di variabili di ambiente!
Il ~/.profile
file può contenere molte cose, per impostazione predefinita contiene tra le altre cose un controllo sull'esistenza di una ~/bin
directory e la aggiunge alla PATH
variabile esistente dell'utente , come questa (nelle versioni precedenti di Ubuntu precedenti al 16.04 - che la aggiunge incondizionatamente - e il 18.04 , che aggiunge anche "~ / .local / bin"):
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
Vedete che il vecchio valore di PATH
viene riutilizzato qui e il nuovo percorso viene aggiunto solo all'inizio anziché sovrascrivere tutto. Quando si desidera aggiungere manualmente nuovi percorsi, è necessario mantenere sempre il vecchio $PATH
valore da qualche parte nella nuova stringa.
Questo script di inizializzazione viene letto solo dalle shell dell'utente a cui appartiene, ma esiste un'altra condizione:
# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
Quindi, se usi la shell Bash predefinita, dovresti assicurarti di non avere un ~/.bash_profile
o ~/.bash_login
se vuoi che le modifiche ~/.profile
abbiano effetto per il tuo utente.
Per una comprensione completa delle variabili di ambiente, consultare: https://help.ubuntu.com/community/EnvironmentVariables
Domanda correlata: differenza tra file bash.bashrc e / etc / environment
~/.profile
non verifica l'esistenza di ~/bin
, ma ha semplicemente la linea:PATH="$HOME/bin:$HOME/.local/bin:$PATH"
/etc/skel/.profile
nel 16.04 ha la linea che ho citato. Apparentemente hai creato il tuo utente in una versione precedente.
~/.profile
avesse ancora questo, ma hai ragione - /etc/skel/.profile
non ce l'ho sul mio sistema 16.04 aggiornato (e un account utente creato durante l'installazione di 16.04 su un'altra macchina non ce l'ha in loro .profile
).
Questa risposta riguarda principalmente l'ordine in cui le variabili di ambiente come
PATH
sono assegnate quando specificate in diversi file di configurazione. Copro anche dove di solito dovresti impostarli, ma l'elenco sotto non elenca i file nell'ordine che dovresti considerare di usarli. Per informazioni generali sull'impostazionePATH
e altre variabili d'ambiente in Ubuntu, consiglio anche di leggere EnvironmentVariables e le altre risposte a questa domanda.
Il luogo preferito da impostare PATH
dipende dagli utenti per i quali è necessario impostarlo e quando e come si desidera che venga impostato. Parte della tua decisione sarà se desideri impostare una variabile d'ambiente per tutti gli utenti o per utente. Se non sei sicuro, ti consiglio di impostarlo per un solo utente (ad es. Il tuo account) piuttosto che a livello di sistema.
Come dice AlexP , la PATH
variabile d'ambiente avrà il valore che è stato assegnato più di recente . In pratica, il più delle volte impostato PATH
, si include il vecchio valore di PATH
nel nuovo valore, in modo che le voci precedenti vengano mantenute.
Pertanto, in pratica, quando PATH
è impostato da più file, di solito contiene le voci fornite in tutti i file. Ma ciò accade solo perché tutti i file che lo impostano, tranne il primo, di solito fanno riferimento alla PATH
variabile stessa, facendo sì che il suo vecchio valore sia incluso in quello nuovo.
Pertanto, si sta effettivamente chiedendo l'ordine in cui le PATH
impostazioni in vari file diventano effettive.
I luoghi comuni e generici da impostare PATH
sono elencati di seguito nell'ordine in cui diventano effettivi quando un utente accede, non nell'ordine che in genere dovresti considerare di usarli . Ognuno dei luoghi elencati di seguito è una scelta ragionevole per l'impostazione PATH
in alcune situazioni , ma solo alcune sono buone scelte per la maggior parte del tempo.
Nell'elenco seguente, vedrai alcuni nomi di directory come ~/.profile
. Nel caso in cui non si abbia familiarità con l' espansione tilde , fare ~/
riferimento alla home directory dell'utente corrente. Uso principalmente questa sintassi per compattezza. È supportato negli script di shell, ma non nei file di configurazione PAM.
/etc/environment
PAM su Ubuntu fa sì /etc/environment
che vengano impostate le variabili di ambiente elencate in , se quel file esiste, cosa che di default lo fa. Ecco come vengono generalmente impostate le variabili di ambiente per tutti gli utenti.
$ cat /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
Se è necessario impostare le variabili di ambiente per tutti gli account utente, anziché solo il proprio account utente, è probabile che la modifica di tale file sia la scelta migliore. Consiglio di eseguire prima il backup. Un modo per eseguire il backup di questo file è eseguire:
sudo cp /etc/environment /etc/environment.orig
L' .orig
estensione non è richiesta in modo specifico: puoi sentirti a tuo agio nel nominare il file di backup in modo che non sia confuso o già utilizzato. (Inoltre .orig
, .old
, .backup
e .bak
sono comuni.)
È possibile modificare questo file in uno qualsiasi dei modi si potrebbe modificare qualsiasi altro file come utente root ( sudoedit /etc/enviromnment
, sudo nano -w /etc/environment
, gksudo gedit /etc/environment
, etc.)
/etc/environment
non supporta l'inclusione automatica del valore precedente di una variabile. Ma questo di solito non è necessario, poiché la maggior parte delle volte si imposta una variabile di ambiente per tutti gli utenti modificando /etc/environment
, si vorrebbe comunque che fosse il suo valore iniziale quando l'utente accede, comunque. L'utente può quindi cambiarlo come preferisce. In genere è bene che gli utenti siano in grado di farlo.
/etc/security/pam_env.conf
PAM legge le variabili di ambiente per tutti gli utenti /etc/security/pam_env.conf
, specificate con la stessa sintassi utilizzata nei ~/.pam_environment
file per utente (vedi sotto).
Quando la stessa variabile di ambiente è impostata in entrambi /etc/environment
e /etc/security/pam_env.conf
, pam_env.conf
viene utilizzato il valore in , anche se quel valore è specificato come DEFAULT
anziché OVERRIDE
.
Tuttavia, quando si sostituisce una riga environment
con una in pam_env.conf
, è possibile includere il contenuto del valore sostituito. Per i dettagli, vedere la sezione seguente .pam_environment
(poiché utilizza la stessa sintassi).
Di solito non è necessario modificare pam_env.conf
e si dovrebbe essere molto attenti se si fa , dal momento che un deforme linea di solito evitare che tutti gli account utente normale dal disboscamento in a tutti! Ad esempio, il valore predefinito pam_env.conf
contiene le righe:
#PATH DEFAULT=${HOME}/bin:/usr/local/bin:/bin\
#:/usr/bin:/usr/local/bin/X11:/usr/bin/X11
Questo è presentato come uno dei numerosi esempi. Una delle cose che illustra è come dividere un compito su più righe con \
. Supponi di dover decommentare solo la prima riga, ma hai dimenticato di decommentare la seconda riga:
PATH DEFAULT=${HOME}/bin:/usr/local/bin:/bin\
#:/usr/bin:/usr/local/bin/X11:/usr/bin/X11
Non farlo!
L'ho provato per sbaglio e questo ha impedito a tutti gli utenti di accedere con successo. Per risolvere il problema, ho dovuto avviare in modalità di ripristino e ripristinarlo. (Fortunatamente l'ho fatto su una macchina virtuale che uso solo per testare le cose, quindi non mi ha causato problemi.)
.pam_environment
nella home directory dell'utenteUno dei modi per impostare una variabile d'ambiente per un singolo utente è che quell'utente modifichi (o crei) .pam_environment
nella propria directory home. I valori impostati in questo file sostituiscono quelli impostati nel /etc/environment
file globale .
.pam_environment
non fa parte dello scheletro di file che viene copiato nella cartella principale di un utente quando l'account utente viene inizialmente creato. Tuttavia, se crei quel file nella tua home directory, puoi usarlo per impostare variabili di ambiente come PATH
. A differenza /etc/environment
(ma simile /etc/security/pam_env.conf
), i .pam_environment
file per utente supportano l'espansione del vecchio valore di una variabile d'ambiente in una nuova. Non sono script di shell, tuttavia, e devi usare una sintassi speciale per raggiungere questo obiettivo, che differisce in qualche modo dalla sintassi che useresti in un file come .profile
.
Ad esempio, se bin2
nella directory home fosse presente una directory che si desidera aggiungere alla fine PATH
, è possibile farlo aggiungendo questa riga a .pam_environment
:
PATH DEFAULT=${PATH}:/home/@{PAM_USER}/bin2
Vedere la ~/.pam_environment
sottosezione di EnvironmentVariables (da cui l'esempio sopra è adattato da vicino) man pam_env
, e man pam_env.conf
per ulteriori dettagli.
Anche se una volta questo è stato pubblicizzato come il modo preferito per gli utenti di Ubuntu di modificare o aggiungere variabili di ambiente ed è ancora considerato una scelta ragionevole e accettabile, è necessario prestare attenzione durante la modifica.pam_environment
. Come le modifiche a tutto il sistema /etc/security/pam_env.conf
(vedi sopra), una riga non valida nel .pam_environment
file di un utente impedirà il corretto accesso. (L'ho testato apposta questa volta.) Per informazioni su come si sono evolute le raccomandazioni , vedere i commenti di Gunnar Hjalmarsson di seguito e questa discussione . ubuntu-devel
Un errore del genere è molto meno grave, in generale , di una linea malformata pam_env.conf
, poiché riguarda solo un utente. Tuttavia, nel caso di un sistema Ubuntu desktop con un solo account utente che consente l'accesso, un tale errore durante la modifica .pam_environment
sarà altrettanto grave di un errore di modifica pam_env.conf
: se non sei già registrato, non sarai in grado per risolverlo senza l'avvio in modalità di ripristino (o da una USB live, ecc.).
(Se si dispone di altri account utente, è possibile accedere come un altro utente e risolvere il problema. Anche se non sono un amministratore e non sudo
sono in grado di eseguire il root, possono comunque eseguire e viene richiesto di inserire la password (non la loro) L' account ospite , tuttavia, non può farlo, poiché è vietato utilizzare per assumere l'identità di un altro utente.)su your-account
su
/etc/profile
e file all'interno/etc/profile.d/
Le shell compatibili con Bourne (inclusa bash
la shell utente predefinita in Ubuntu) eseguono i comandi /etc/profile
quando vengono invocate come shell di accesso.
Ubuntu /etc/profile.d
termina con:
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
Questo fa sì che vengano eseguiti anche i comandi in qualsiasi file nella /etc/profile.d/
directory il cui nome termina .sh
.
La maggior parte dei gestori di visualizzazione causa l' esecuzione dei comandi in /etc/profile
(e quindi dei file in /etc/profile.d
) anche per gli accessi grafici. Tuttavia, non tutti lo fanno, e questo è un argomento significativo a favore dell'utilizzo delle strutture fornite da PAM (vedi sopra) - a meno che non ci saranno mai accessi grafici a questo sistema, che potrebbe essere il caso, ad esempio, se è un server senza GUI installato.
È tradizionale impostare variabili di ambiente a livello di sistema /etc/profile
, ma questa non è spesso la scelta migliore. Se non riesci a impostare una variabile di ambiente /etc/environment
e devi impostarla per tutti gli utenti, probabilmente è meglio creare un nuovo file /etc/profile.d/
piuttosto che modificarlo /etc/profile
. Uno dei motivi è che, quando Ubuntu viene aggiornato, potrebbe esserci un nuovo /etc/profile
file predefinito . A seconda di come si esegue l'aggiornamento, verrà conservato il vecchio file (con le modifiche), rinunciando a quel particolare file di configurazione aggiornato, o verrà richiesto di gestire la situazione.
Quando la stessa variabile di ambiente è impostata in entrambi /etc/profile
e uno o più file in /etc/profile.d
, quale viene eseguito per ultimo? Questo dipende dal fatto che i comandi in /etc/profile
quel set compaiano prima o dopo che i file in profile.d
sono stati originati (dal codice che ho citato sopra). I comandi in /etc/profile
vengono eseguiti nell'ordine in cui appaiono.
/etc/profile
è uno script di shell e la sua sintassi non è la stessa di quella dei file di configurazione di PAM discussi sopra . La sua sintassi è la stessa della sintassi per il ~/.profile
file per utente (vedi sotto).
Se hai bisogno di scrivere un codice che decida se aggiungere o meno una particolare directory PATH
(e farlo per tutti gli utenti), non sarai in grado di usarlo /etc/environment
o /etc/security/pam_env.conf
farlo. Questa è forse la situazione principale in cui è meglio usare /etc/profile
o /etc/profile.d/
invece.
.bash_profile
nella home directory dell'utenteSe un utente ha ~/.bash_profile
, bash lo usa invece di ~/.profile
o ~/.bash_login
(vedi sotto). Di solito non dovresti avere un .bash_profile
nella tua home directory.
Se lo fai, di solito dovrebbe contenere un comando per sorgente ~/.profile
(ad esempio, . "$HOME/.profile"
). Altrimenti, il contenuto del .profile
file per utente non viene eseguito affatto.
.bash_login
nella home directory dell'utenteSe un utente ha ~/.bash_login
, bash lo usa invece di ~/.profile
(vedi sotto), a meno che non ~/.bash_profile
esista, nel qual caso nessuno degli altri verrà usato a meno che non provenga da `~ / .bash_login.
Come con .bash_profile
, di solito non dovresti avere un .bash_login
file nella tua home directory.
.profile
nella home directory dell'utente.Quando una shell in stile Bourne viene eseguita come shell di login, esegue i comandi /etc/profile
(che in genere include comandi che causano l' /etc/profile.d/
esecuzione dei comandi nei file - vedi sopra). Successivamente, esegue i comandi nella .profile
home directory dell'utente. Questo file è separato per ogni utente. (Bash in realtà funziona .bash_profile
o .bash_login
invece se esiste - ma, per gli utenti su un sistema Ubuntu, quei file raramente dovrebbero o esistono. Per i dettagli, vedere sopra e 6.2 File di avvio di Bash nel manuale di Bash .)
~/.profile
è quindi il luogo principale in cui l'utente può inserire i comandi eseguiti al momento dell'accesso. È il posto tradizionale in cui impostare il tuo PATH
, ma poiché Ubuntu ha il modulo pam_env e supporta ~/.pam_environment
, dovresti considerare di usarlo.
Come nel caso /etc/profile
, non tutti i gestori display eseguono questo file per accessi grafici, sebbene la maggior parte lo faccia. Questo è un motivo per preferire ~/.pam_environment
per impostare le variabili d'ambiente (per quanto si possa preferire /etc/environment
a /etc/profile
).
È possibile espandere le variabili di ambiente, compreso PATH
se stesso, quando si imposta PATH
in .pam_environment
(vedi sopra). Tuttavia, se è necessario impostare PATH
in un modo più sofisticato, potrebbe essere necessario utilizzare .profile
invece il tuo . In particolare, se si desidera verificare l'esistenza di una directory ogni volta che un utente accede e aggiungerla solo in tal PATH
caso, non sarà possibile utilizzare il .pam_environment
file per aggiungere quella directory alla propria PATH
.
Ad esempio, l'impostazione predefinita per il singolo utente .profile
di file su Ubuntu utilizzato per terminare con:
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
Vedi il commento di Gunnar Hjalmarsson sulla risposta del comandante di byte per i dettagli.
Controlla se hai una bin
sottodirectory della tua home directory. Se è così, aggiunge quella sottodirectory all'inizio del tuo PATH
.
Esistono altri modi in cui le variabili di ambiente vengono impostate quando gli utenti effettuano l'accesso che dipendono maggiormente dal tipo di accesso. Ad esempio, potresti avere occasionalmente variabili d'ambiente che vengono impostate solo per accessi grafici o solo per accessi remoti basati su SSH. L'elenco sopra non copre tali casi.
Ho lasciato fuori alcuni file in cui le persone a volte definiscono variabili di ambiente, come ~/.bashrc
e /etc/bash.bashrc
, poiché in genere non sono luoghi consigliati da impostare PATH
ed è raro che tu debba effettivamente usarle per questo scopo. Se si utilizzano questi file per aggiungere directory PATH
, a volte verranno aggiunti molte volte ed è molto confuso quando si esamina $PATH
. (In casi estremi questo può rallentare le cose, ma di solito è solo una questione di mantenere tutto pulito e comprensibile.)
Poiché bash
è la shell di accesso predefinita di Ubuntu per gli utenti e la maggior parte degli utenti la usa o qualche altra shell compatibile con POSIX, ho omesso informazioni su come le variabili di ambiente sono impostate in altre shell non di tipo Bourne come tcsh
.
/etc/environment
/ ~/.pam_environment
come i file consigliati. Dopo aver consultato gli sviluppatori, l' ho modificato in modo che fosse neutro tra PAM e /etc/profile.d/*.sh
/ ~/.profile
e tendo ancora a guardarlo in quel modo.
/etc/profile.d/*.sh
/ ~/.profile
sono che la sintassi è più semplice e che lightdm / gdm perdonano in caso di errori (nemmeno errori di sintassi impediscono l'accesso, ma generano solo messaggi di avviso).
pam_env.so
, volevi dire pam_env.conf
?
pam_env.conf
. Grazie! Ho modificato per risolverlo.
Il file / etc / environment non è un file di script che non è possibile utilizzare lì per l'esportazione e non supporta l'espansione variabile del tipo $ HOME, solo coppie semplici = variabili. Quindi, per usare quel file, dovresti semplicemente aggiungere il tuo percorso alla definizione esistente, è specificamente pensato per le impostazioni delle variabili di ambiente a livello di sistema. uno per riga. In particolare, questo file memorizza le impostazioni locali e del percorso a livello di sistema.
~ / .profile - Questo file viene eseguito ogni volta che viene eseguita una shell bash, di solito è quella consigliata per le variabili di ambiente, tuttavia ha lo svantaggio di essere invocata solo dalle shell di login, quindi per renderlo effettivo avrai bisogno per disconnettersi e riconnettersi - o almeno, avviare una nuova shell di accesso.
Il luogo preferito per impostare le variabili ambientali dipende da diverse cose:
/etc/environment
quanto non vi è pericolo di accesso non autorizzato./etc/environment
, ma~/.profile
pertinente per ciascun utente del sistema poiché si trova nella home directory di ciascun utente.Il sistema leggerà /etc/environment
prima di leggere ~/.profile
. Non si verifica alcuna concatenazione e, come ha detto Alex P , prevale l'ultimo incarico di path.
Per uno sguardo più dettagliato ai fattori che determinano come ~/.profile
e si /etc/environment
gioca con altri luoghi simili, vai qui e qui , poiché questi fattori influenzeranno il modo in cui usi questi luoghi.