Impostazione della variabile PATH in / etc / environment vs .profile


58

Dov'è il posto preferito per impostare PATHenvvar?

~/.profileo /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?


L'ultimo incarico a PATH prevale, ovviamente. La maggior parte degli script lo imposta esplicitamente all'inizio dello script.
AlexP

Risposte:


72

Sommario:

  • Se vuoi aggiungere un percorso (es. /your/additional/path) PATHAlla tua variabile solo per il tuo attuale utente e non per tutti gli utenti del tuo computer, normalmente lo metti alla fine ~/.profilecome 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/environmentma di creare un file con il nome del file che termina .shcon /etc/profile.d/. Lo /etc/profilescript e tutti gli script in /etc/profile.dsono l'equivalente globale di ogni utente personale ~/.profileed 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 rootperò, quindi devi essere un utente amministratore e usarlo sudoper 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/profilee /etc/profile.d/*.shsono gli script di inizializzazione globale equivalenti a ~/.profileper ciascun utente. Gli script globali vengono eseguiti prima degli script specifici dell'utente; e il main /etc/profileesegue tutti gli *.shscript /etc/profile.d/appena prima di uscire.


  • Il /etc/environmentfile 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 PATHvariabile 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/bine /usr/sbinda 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 ~/.profilefile può contenere molte cose, per impostazione predefinita contiene tra le altre cose un controllo sull'esistenza di una ~/bindirectory e la aggiunge alla PATHvariabile 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 PATHviene 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 $PATHvalore 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_profileo ~/.bash_loginse vuoi che le modifiche ~/.profileabbiano 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


2
Al giorno d'oggi ~/.profilenon verifica l'esistenza di ~/bin, ma ha semplicemente la linea:PATH="$HOME/bin:$HOME/.local/bin:$PATH"
Gunnar Hjalmarsson

1
@GunnarHjalmarsson Definisci "oggi", per favore? Sto correndo il 16.04 ed è così che sembra lì.
Byte Commander

2
/etc/skel/.profilenel 16.04 ha la linea che ho citato. Apparentemente hai creato il tuo utente in una versione precedente.
Gunnar Hjalmarsson,

1
@GunnarHjalmarsson Grazie per le informazioni - fino a circa cinque minuti fa , pensavo che anche l'impostazione predefinita ~/.profileavesse ancora questo, ma hai ragione - /etc/skel/.profilenon 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).
Eliah Kagan,

2
"... eseguito come script di shell regolari da tutte le shell durante la loro inizializzazione." Penso che questo sia fuorviante. Potrebbe suggerire (ad alcuni) che semplicemente aprendo una shell terminale non di accesso dal desktop della GUI verrà eseguito / etc / profile, cosa che non avverrà. askubuntu.com/questions/155865/…
Hawkeye Parker,

22

Questa risposta riguarda principalmente l'ordine in cui le variabili di ambiente come PATHsono 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'impostazione PATHe altre variabili d'ambiente in Ubuntu, consiglio anche di leggere EnvironmentVariables e le altre risposte a questa domanda.

Il luogo preferito da impostare PATHdipende 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 PATHvariabile 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 PATHnel 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 PATHvariabile stessa, facendo sì che il suo vecchio valore sia incluso in quello nuovo.

Pertanto, si sta effettivamente chiedendo l'ordine in cui le PATHimpostazioni in vari file diventano effettive.

I luoghi comuni e generici da impostare PATHsono 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.

1. Per tutti gli utenti: /etc/environment

PAM su Ubuntu fa sì /etc/environmentche 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' .origestensione 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, .backupe .baksono 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/environmentnon 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.

2. Per tutti gli utenti: /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_environmentfile per utente (vedi sotto).

Quando la stessa variabile di ambiente è impostata in entrambi /etc/environmente /etc/security/pam_env.conf, pam_env.confviene utilizzato il valore in , anche se quel valore è specificato come DEFAULTanziché OVERRIDE.

Tuttavia, quando si sostituisce una riga environmentcon 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.confe 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.confcontiene 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.)

3. Per un utente: .pam_environmentnella home directory dell'utente

Uno dei modi per impostare una variabile d'ambiente per un singolo utente è che quell'utente modifichi (o crei) .pam_environmentnella propria directory home. I valori impostati in questo file sostituiscono quelli impostati nel /etc/environmentfile globale .

.pam_environmentnon 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_environmentfile 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 bin2nella 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_environmentsottosezione di EnvironmentVariables (da cui l'esempio sopra è adattato da vicino) man pam_env, e man pam_env.confper 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_environmentfile 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_environmentsarà 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 sudosono 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-accountsu

4. Per tutti gli utenti: /etc/profilee file all'interno/etc/profile.d/

Le shell compatibili con Bourne (inclusa bashla shell utente predefinita in Ubuntu) eseguono i comandi /etc/profilequando vengono invocate come shell di accesso.

Ubuntu /etc/profile.dtermina 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/environmente 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/profilefile 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/profilee uno o più file in /etc/profile.d, quale viene eseguito per ultimo? Questo dipende dal fatto che i comandi in /etc/profilequel set compaiano prima o dopo che i file in profile.dsono stati originati (dal codice che ho citato sopra). I comandi in /etc/profilevengono 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 ~/.profilefile 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/environmento /etc/security/pam_env.conffarlo. Questa è forse la situazione principale in cui è meglio usare /etc/profileo /etc/profile.d/invece.

5. Per un utente: .bash_profilenella home directory dell'utente

Se un utente ha ~/.bash_profile, bash lo usa invece di ~/.profileo ~/.bash_login(vedi sotto). Di solito non dovresti avere un .bash_profilenella tua home directory.

Se lo fai, di solito dovrebbe contenere un comando per sorgente ~/.profile(ad esempio, . "$HOME/.profile"). Altrimenti, il contenuto del .profilefile per utente non viene eseguito affatto.

6. Per un utente: .bash_loginnella home directory dell'utente

Se un utente ha ~/.bash_login, bash lo usa invece di ~/.profile(vedi sotto), a meno che non ~/.bash_profileesista, 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_loginfile nella tua home directory.

7. Per un utente: .profilenella 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 .profilehome directory dell'utente. Questo file è separato per ogni utente. (Bash in realtà funziona .bash_profileo .bash_logininvece 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_environmentper impostare le variabili d'ambiente (per quanto si possa preferire /etc/environmenta /etc/profile).

È possibile espandere le variabili di ambiente, compreso PATHse stesso, quando si imposta PATHin .pam_environment(vedi sopra). Tuttavia, se è necessario impostare PATHin un modo più sofisticato, potrebbe essere necessario utilizzare .profileinvece il tuo . In particolare, se si desidera verificare l'esistenza di una directory ogni volta che un utente accede e aggiungerla solo in tal PATHcaso, non sarà possibile utilizzare il .pam_environmentfile per aggiungere quella directory alla propria PATH.

Ad esempio, l'impostazione predefinita per il singolo utente .profiledi 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 binsottodirectory della tua home directory. Se è così, aggiunge quella sottodirectory all'inizio del tuo PATH.

Tale elenco omette alcune possibilità.

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 ~/.bashrce /etc/bash.bashrc, poiché in genere non sono luoghi consigliati da impostare PATHed è 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.


1
[commento n. 1 di 2] Grazie per questa ampia descrizione! (Ho fatto una modifica minore.) Tuttavia, ho dei dubbi in merito alle modalità consigliate. Alcuni anni fa EnvironmentVariables menzionato /etc/environment/ ~/.pam_environmentcome i file consigliati. Dopo aver consultato gli sviluppatori, l' ho modificato in modo che fosse neutro tra PAM e /etc/profile.d/*.sh/ ~/.profilee tendo ancora a guardarlo in quel modo.
Gunnar Hjalmarsson,

1
[commento n. 2 di 2] Hai menzionato un paio di argomenti a favore di PAM. Argomenti importanti a favore di /etc/profile.d/*.sh/ ~/.profilesono 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).
Gunnar Hjalmarsson,

Quando hai detto pam_env.so, volevi dire pam_env.conf?
Johan Boulé,

@ JohanBoulé Sì, intendevo dire pam_env.conf. Grazie! Ho modificato per risolverlo.
Eliah Kagan,

3

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.


1

Il luogo preferito per impostare le variabili ambientali dipende da diverse cose:

  1. Sei l'unico che utilizza il computer:
    • In questo caso, il posto migliore per impostarlo sarebbe in /etc/environmentquanto non vi è pericolo di accesso non autorizzato.
  2. Se il sistema è utilizzato da molti
    • Se tutte le variabili fossero accessibili a tutti, allora la posizione sarebbe /etc/environment, ma
    • se i singoli utenti dovrebbero aver selezionato l'accesso a loro, ognuno dovrebbe impostare il proprio nel~/.profile pertinente per ciascun utente del sistema poiché si trova nella home directory di ciascun utente.

Il sistema leggerà /etc/environmentprima 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 ~/.profilee si /etc/environmentgioca con altri luoghi simili, vai qui e qui , poiché questi fattori influenzeranno il modo in cui usi questi luoghi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.