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

29

Dove si trova il luogo preferito per impostare PATH envvar?

~/.profile o /etc/environment ?

Che cosa succede quando PATH è impostato in entrambe le posizioni? Il risultato finale è una concatenazione di entrambi i valori impostati in questi due punti?

    
posta pkaramol 30.12.2016 - 14:45

4 risposte

37

Riepilogo:

  • Se vuoi aggiungere un percorso (es. /your/additional/path ) alla tua variabile PATH solo per l'utente corrente e non per tutti gli utenti del tuo computer, normalmente lo metti alla fine di ~/.profile come in uno di questi due esempi:

    PATH="/your/additional/path:$PATH"
    PATH="$PATH:/your/additional/path"
    

    Si noti che le priorità del percorso stanno scendendo 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 sostituiranno tutti gli altri. Se aggiungi il tuo percorso a destra, avrà la priorità più bassa e saranno preferiti gli eseguibili delle altre posizioni.

  • Tuttavia, se è necessario impostare tale variabile d'ambiente per tutti gli utenti, non consiglierei di toccare /etc/environment ma creare un file con il nome del file che termina in .sh in /etc/profile.d/ . Lo script /etc/profile e tutti gli script in /etc/profile.d sono l'equivalente globale del ~/.profile di ogni utente e vengono eseguiti come script di shell regolari da tutte le shell durante l'inizializzazione.

Ulteriori dettagli:

  • /etc/environment è un file di configurazione a livello di sistema, il che significa che è utilizzato da tutti gli utenti. È di proprietà di root , quindi devi essere un utente amministratore e utilizzare 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 globali che equivalgono a ~/.profile per ciascun utente. Gli script globali vengono eseguiti prima degli script specifici dell'utente; e il /etc/profile principale esegue tutti gli script *.sh in /etc/profile.d/ appena prima che esca.

  • Il file /etc/environment 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 variabile PATH per tutti gli utenti del sistema su questo valore predefinito, che non dovrebbe essere modificato in modo sostanziale. Almeno non dovresti rimuovere nessuno dei 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. Nota 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 d'ambiente!

  • Il file ~/.profile può contenere molte cose, per impostazione predefinita contiene tra l'altro una verifica se esiste una directory ~/bin e la aggiunge alla variabile PATH dell'utente, come questa (su versioni precedenti di Ubuntu precedenti a 16.04 - le nuove versioni lo aggiungono incondizionatamente):

    # set PATH so it includes user's private bin if it exists
    if [ -d "$HOME/bin" ] ; then
        PATH="$HOME/bin:$PATH"
    fi
    

    Si vede che il vecchio valore di PATH viene riutilizzato qui e il nuovo percorso viene aggiunto solo all'inizio invece di sovrascrivere tutto. Quando desideri aggiungere manualmente nuovi percorsi, devi sempre mantenere il vecchio valore $PATH da qualche parte nella nuova stringa.

    Questo script di inizializzazione viene letto solo dalle shell dell'utente a cui appartiene, ma c'è 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 in ~/.profile abbiano un effetto per il tuo utente.

Per una comprensione completa delle variabili d'ambiente vedi: link

Domanda correlata: differenza tra bash.bashrc e / etc / environment file

    
risposta data Byte Commander 30.12.2016 - 15:10
15
  

Questa risposta riguarda principalmente l'ordine in cui sono assegnate variabili di ambiente come PATH quando specificato in diversi file di configurazione. Faccio anche riferimento a dove dovresti solitamente impostarli, ma l'elenco seguente non elenca i file nell'ordine in cui dovresti considerare di utilizzarli. Per informazioni generali sull'impostazione di PATH e altre variabili di ambiente in Ubuntu, consiglio anche di leggere EnvironmentVariables e le altre risposte a questa domanda.

Il luogo preferito per impostare PATH dipende da quali utenti devi impostare per e quando e come vuoi che sia impostato. Parte della decisione sarà se si desidera impostare una variabile di 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) anziché su tutto il sistema.

Come AlexP dice , il% co_de La variabile d'ambiente% avrà il valore che era assegnata più di recente . In pratica, la maggior parte del tempo impostato PATH , includi il vecchio valore di PATH nel nuovo valore, in modo che le voci precedenti vengano mantenute.

Quindi, 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 variabile PATH stessa, causandone l'inserimento del nuovo valore.

Pertanto, stai effettivamente richiedendo l'ordine in cui le impostazioni di PATH in vari file diventano effettive.

I luoghi comuni e generici per impostare PATH sono elencati di seguito nell'ordine in cui hanno effetto quando un utente effettua l'accesso, non nell'ordine che dovresti considerare di utilizzare li . Ognuno dei luoghi elencati di seguito è una scelta ragionevole per impostare PATH in alcune situazioni , ma solo alcune sono buone scelte il più delle volte.

Nell'elenco seguente, vedrai alcuni nomi di directory come PATH . Se non hai familiarità con espansione tilde , ~/.profile si riferisce al directory home dell'utente corrente. Principalmente uso questa sintassi per compattezza. È supportato negli script di shell, ma non nei file di configurazione di PAM.

1. Per tutti gli utenti: ~/

PAM su Ubuntu fa sì che le variabili di ambiente elencate in /etc/environment siano impostate, se questo file esiste, quale di default lo fa. È così che le variabili di ambiente per tutti gli utenti sono più comunemente impostate.

$ cat /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"

Se devi impostare le variabili di ambiente per gli tutti account utente, anziché solo il tuo account utente, allora la modifica di quel file è probabilmente la scelta migliore. Consiglio di fare il backup prima. Un modo per eseguire il backup di questo file è eseguire:

sudo cp /etc/environment /etc/environment.orig

L'estensione /etc/environment non è specificatamente richiesta: puoi stare bene a dare un nome al file di backup a qualsiasi cosa che non sia confusa o che sia già in uso. (Oltre .orig , .orig , .old e .backup sono comuni.)

Puoi modificare questo file in uno qualsiasi dei modi in cui potresti modificare qualsiasi altro file come utente root ( .bak , sudoedit /etc/enviromnment , sudo nano -w /etc/environment , ecc.)

gksudo gedit /etc/environment non supporta l'inclusione automatica del vecchio valore 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 che fosse il suo valore iniziale quando l'utente si collega, comunque. L'utente potrebbe quindi cambiarlo come preferisce. In genere è utile per gli utenti essere in grado di farlo.

2. Per tutti gli utenti: /etc/environment

PAM legge le variabili di ambiente per tutti gli utenti da /etc/security/pam_env.conf , specificate con la stessa sintassi utilizzata nei file per% di% di file per utente (vedi sotto).

Quando la stessa variabile di ambiente è impostata sia in /etc/security/pam_env.conf che in ~/.pam_environment , viene utilizzato il valore in /etc/environment - anche se tale valore è specificato come /etc/security/pam_env.conf anziché pam_env.conf .

Tuttavia, quando sostituisci una riga in DEFAULT con una in OVERRIDE , puoi includere il contenuto del valore sostituito. Vedi la sezione seguente su environment per i dettagli (poiché usa la stessa sintassi).

Di solito non è necessario modificare pam_env.conf e dovresti stare molto attento se lo fai , poiché una riga malformata di solito impedisce l'accesso a tutti i normali account utente affatto! Ad esempio, il valore predefinito .pam_environment 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 suddividere un compito su più righe con pam_env.conf .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 appena testato per errore e impedito a tutti gli utenti di accedere correttamente. Per risolvere il problema, ho dovuto avviare in modalità di ripristino e modificarlo. (Fortunatamente l'ho fatto su una macchina virtuale che uso solo per testare le cose, quindi non mi ha causato alcun problema.)

3. Per un utente: pam_env.conf nella directory home dell'utente

Uno dei modi per impostare una variabile di ambiente per un singolo utente è che l'utente possa modificare (o creare) \ nella propria directory home. I valori impostati in questo file sostituiscono quelli impostati nel file .pam_environment globale.

.pam_environment non fa parte dello scheletro di file che vengono copiati nella cartella home di un utente quando viene creato inizialmente l'account utente. Tuttavia, se crei quel file nella tua directory home, puoi usarlo per impostare variabili di ambiente come /etc/environment . A differenza di .pam_environment (ma come PATH ), i file per-utente /etc/environment supportano l'espansione del vecchio valore di una variabile d'ambiente in una nuova. Tuttavia, non sono script di shell e per ottenere ciò è necessario utilizzare una sintassi speciale, che differisce in qualche modo dalla sintassi che si utilizzerà in un file come /etc/security/pam_env.conf .

Ad esempio, se nella tua home directory hai una directory .pam_environment che desideri aggiungere alla fine di .profile , puoi farlo aggiungendo questa riga a bin2 :

PATH DEFAULT=${PATH}:/home/@{PAM_USER}/bin2

Vedi la sottosezione PATH di EnvironmentVariables (da cui l'esempio precedente è adattato da vicino), .pam_environment e ~/.pam_environment per ulteriori dettagli.

Sebbene questo sia stato un tempo propagandato come il modo preferito per gli utenti di Ubuntu di modificare o aggiungere variabili d'ambiente ed è ancora considerato una scelta ragionevole e accettabile, dovresti stare attento quando modifichi man pam_env . Come le modifiche al man pam_env.conf del sistema (vedi sopra), una riga non corretta nel file .pam_environment di un utente impedirà il corretto accesso. (L'ho provato, questa volta apposta.) Per informazioni su come i consigli hanno evoluto , vedi Gunnar Hjalmarsson commenti sotto e questa discussione /etc/security/pam_env.so .

Un tale errore è molto meno grave, in generale , di una riga malformata in .pam_environment , perché riguarda solo un utente. Tuttavia, nel caso di un sistema Ubuntu desktop con un solo account utente che consente l'accesso, un errore simile durante la modifica di ubuntu-devel sarà altrettanto grave di un errore di modifica pam_env.so - se non hai già effettuato l'accesso, non sarai in grado di risolverlo senza avviare la modalità di ripristino (o da una porta USB, ecc.).

(Se disponi di altri account utente, puoi accedere come un altro utente e risolvere il problema. Anche se non sono amministratori e non possono% ro_de% per root, possono comunque eseguire .pam_environment ed essere richiesto di inserire la tua password (non loro). L'account guest , tuttavia, non può farlo, poiché è vietato utilizzare pam_env.so per assumere l'identità di un altro utente.)

4. Per tutti gli utenti: sudo e file all'interno su your-account

Le shell compatibili con Bourne (incluso su , la shell utente predefinita in Ubuntu) eseguono i comandi in /etc/profile quando vengono invocate come shell di login.

/etc/profile.d/ di Ubuntu 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

Ciò causa i comandi in qualsiasi file nella directory bash il cui nome termina con /etc/profile per essere eseguito pure.

La maggior parte dei display manager fa sì che i comandi in /etc/profile.d (e quindi i file in /etc/profile.d/ ) vengano eseguiti anche per gli accessi grafici. Tuttavia, non tutti lo fanno, e questo è un argomento significativo a favore dell'uso delle strutture fornite da PAM invece (vedi sopra) - a meno che non ci saranno mai accessi grafici a questo sistema, che potrebbe essere il caso, ad esempio, se si tratta di un server senza GUI installata.

È tradizione impostare le variabili di ambiente a livello di sistema in .sh , ma spesso questa non è la scelta migliore. Se non puoi impostare una variabile di ambiente in /etc/profile , e devi impostarla per tutti gli utenti, probabilmente è meglio creare un nuovo file in /etc/profile.d che modificare /etc/profile stesso.Una delle ragioni è che, quando si aggiorna Ubuntu, potrebbe esserci un nuovo file /etc/environment predefinito. A seconda di come si esegue l'aggiornamento, verrà mantenuto il vecchio file (con le modifiche), con la rinuncia a quel particolare file di configurazione aggiornato, o verrà richiesto di gestire la situazione.

Quando la stessa variabile di ambiente è impostata sia in /etc/profile.d/ sia in uno o più file in /etc/profile , che viene eseguita per ultimo? Questo dipende dal fatto che i comandi in /etc/profile li impostino appaiono prima o dopo che i file in /etc/profile sono stati originati (dal codice che ho citato sopra). I comandi in /etc/profile.d vengono eseguiti nell'ordine in cui appaiono.

/etc/profile è uno script di shell e la sua sintassi è non uguale a quella dei file di configurazione PAM discussi sopra . La sua sintassi è la stessa della sintassi per il file profile.d per utente (vedi sotto).

Se hai bisogno di scrivere codice che decide se aggiungere o meno una particolare directory a /etc/profile (e farlo per tutti gli utenti), non potrai usare /etc/profile o ~/.profile per farlo. Questa è forse la situazione principale in cui è preferibile utilizzare PATH o /etc/environment .

5. Per un utente: /etc/security/pam_env.conf nella directory home dell'utente

Se un utente ha /etc/profile , bash lo usa invece di /etc/profile.d/ o .bash_profile (vedi sotto). Di solito non dovresti avere un ~/.bash_profile nella tua home directory.

Se lo fai, di solito dovrebbe contenere un comando per generare ~/.profile (ad esempio ~/.bash_login ). In caso contrario, il contenuto del file .bash_profile per utente non verrà eseguito affatto.

6. Per un utente: ~/.profile nella directory home dell'utente

Se un utente ha . "$HOME/.profile" , bash lo utilizza invece di .profile (vedi sotto), a meno che esista .bash_login , nel qual caso nessuno degli altri verrà utilizzato a meno che non sia originario di '~ / .bash_login.

Come con ~/.bash_login , in genere non dovresti avere un file ~/.profile nella tua directory home.

7. Per un utente: ~/.bash_profile nella directory home dell'utente.

Quando una shell di tipo Bourne viene eseguita come shell di login, esegue i comandi in .bash_profile (che in genere include comandi che causano l'esecuzione dei comandi nei file in .bash_login - vedi sopra). Dopodiché, esegue i comandi in .profile nella home directory dell'utente. Questo file è separato per ogni utente. (Bash esegue effettivamente /etc/profile o /etc/profile.d/ invece se esistono - ma, per gli utenti su un sistema Ubuntu, quei file dovrebbero o non esistono. Per i dettagli, vedi sopra e 6.2 Bash Startup Files in il manuale di Bash .)

.profile è quindi il luogo principale in cui l'utente può inserire comandi eseguiti al loro accesso. È il posto tradizionale in cui puoi impostare il .bash_profile , ma dal momento che Ubuntu ha il modulo pam_env e supporta .bash_login , dovresti considerare di usarlo.

Come con ~/.profile , non tutti i display manager eseguono questo file per accessi grafici, sebbene la maggior parte lo faccia. Questo è un motivo per preferire PATH per l'impostazione delle variabili di ambiente (come preferisci ~/.pam_environment a /etc/profile ).

Puoi espandere le variabili di ambiente, incluso ~/.pam_environment stesso, quando imposti /etc/environment in /etc/profile (vedi sopra). Tuttavia, se devi impostare PATH in un modo più sofisticato, potresti dover utilizzare invece PATH . In particolare, se si desidera verificare se esiste una directory ogni volta che un utente esegue l'accesso e lo aggiunge a .pam_environment se lo fa, non sarà possibile utilizzare il file PATH per aggiungere tale directory al proprio .profile .

Ad esempio, il file predefinito per% utente co_de% su Ubuntu usato per termina con:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Vedi Gunnar Hjalmarsson 's commento su Byte La risposta del comandante per i dettagli.

Controlla se hai una sottodirectory PATH della tua home directory. In tal caso, aggiunge tale sottodirectory all'inizio del tuo .pam_environment .

Questa lista omette alcune possibilità.

Esistono altri modi in cui le variabili di ambiente vengono impostate quando gli utenti accedono che dipendono in modo più pesante dal tipo di accesso. Ad esempio, potresti occasionalmente avere variabili d'ambiente che vengono impostate solo per gli accessi grafici o solo per gli accessi remoti basati su SSH. L'elenco sopra non copre questi casi.

Ho omesso alcuni file in cui le persone a volte definiscono le variabili di ambiente, come PATH e .profile , perché in genere non sono consigliate le posizioni per impostare bin ed è raro che dovresti effettivamente usarle per questo scopo. Se utilizzi questi file per aggiungere directory a PATH , a volte verranno aggiunti molte volte ed è molto confuso quando esamini ~/.bashrc . (In casi estremi questo può rallentare le cose, ma di solito è solo una questione di mantenere tutto pulito e comprensibile.)

Poiché /etc/bash.bashrc è la shell di login predefinita di Ubuntu per gli utenti, e la maggior parte degli utenti lo usa o qualche altra shell POSIX-compatibile, ho omesso informazioni su come le variabili di ambiente sono impostate in altri shell non di tipo Bourne come PATH .

    
risposta data Eliah Kagan 30.12.2016 - 19:30
3
Il file

/ etc / environment non è un file di script che non puoi esportare lì e non supporta l'espansione variabile del tipo $ HOME, solo coppie simplevariable = value. Pertanto, per utilizzare tale file, è necessario semplicemente aggiungere il percorso alla definizione esistente, in particolare per le impostazioni delle variabili di ambiente a livello di sistema. uno per linea. In particolare, questo file memorizza le impostazioni internazionali del percorso e del percorso.

~ / .profile - Questo file viene eseguito ogni volta che viene eseguita una shell bash, di solito è consigliato per le variabili di ambiente, tuttavia ha lo svantaggio di essere invocato solo da shell di login, quindi in Per fare in modo che diventi effettivo, devi uscire e rientrare o, almeno, avviare una nuova shell di login.

    
risposta data eGhoul 30.12.2016 - 15:07
1

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

  1. Sei l'unico a usare il computer:
    • In questo caso, il posto migliore per impostarlo sarebbe nel /etc/environment poiché non vi è alcun pericolo di accesso _unauthorized.
  2. Se il sistema è usato da molti
    • Se le variabili dovrebbero essere accessibili da tutti, allora la posizione sarebbe /etc/environment , ma
    • se i singoli utenti devono aver selezionato l'accesso ad essi, ciascuno deve impostarli nella ~/.profile relativa a ciascun utente del sistema poiché si trova in ogni home dell'utente directory.

Il sistema leggerà /etc/environment prima di leggere ~/.profile . Non avviene la concatenazione e Alex P ha detto che l'ultimo compito al percorso prevale.

Per informazioni più dettagliate sui fattori che determinano il modo in cui ~/.profile e /etc/environment vengono riprodotti con altre località simili, vai qui e qui , poiché questi fattori influenzeranno il modo in cui utilizzi queste posizioni.

    
risposta data George Udosen 30.12.2016 - 15:10

Leggi altre domande sui tag