Vista completa di dove è impostata la variabile PATH in bash


17

Ho letto in un paio di punti in cui PATHè impostato /etc/profileo il .profilefile che si trova nella directory home.

Questi sono gli unici posti in cui è impostato il percorso? Voglio una migliore comprensione di ciò.

Nel /etc/profilefile, come dice il seguente commento "system-wide .profile file for the Bourne shell". Ciò significa che i file di profilo sono i file di configurazione principali per bash?

In quel file non vedo affatto la PATHvar impostata. Nel .profilefile nella home directory c'è questa riga:

PATH="$HOME/bin:$PATH"

Questo è azzerato PATHdagli sguardi perché sta concatenando la $PATHstringa già impostata con $HOME/bin:giusto? Ma se etc/profilee ~/.profilesono gli unici file impostati da PATHdove $PATHproviene quella riga di codice se non è definito in /etc/profile?

Qualcuno con esperienza può fornire una spiegazione ampia e dettagliata della PATHvariabile? Grazie!

Risposte:


20

Ci sono molti posti in cui è PATHpossibile impostare.

Il loginprogramma lo imposta su un valore predefinito. La modalità di configurazione di questo valore predefinito dipende dal sistema. Sulla maggior parte dei sistemi Linux non incorporati, viene preso da /etc/login.defs, con valori diversi per root e per altri utenti. Consulta il login(1)manuale del tuo sistema per scoprire cosa fa.

Sui sistemi che utilizzano PAM , in particolare il pam_envmodulo, è possibile impostare variabili di ambiente nel file di sistema e nel file /etc/environmentper utente ~/.pam_environment.

Quindi la maggior parte dei modi per accedere (ma non i lavori cron) esegue una shell di accesso che legge i file di configurazione a livello di sistema e per utente. Questi file possono modificare il valore di PATH, in genere per aggiungere voci ma a volte in altri modi. I file letti dipendono dalla shell di accesso. Conchiglie in stile Bourne / POSIX leggere /etc/profilee ~/.profile. Bash legge /etc/profile, ma per il file per utente si legge solo il file prima esistente tra ~/.bash_profile, ~/.bash_logine ~/.profile. Zsh legge /etc/zshenv, ~/.zshenv, /etc/zprofile, ~/.zprofile, /etc/zlogine ~/.zlogin. Molte sessioni della GUI prevedono il caricamento /etc/profilee ~/.profile, ma ciò dipende dal display manager, dall'ambiente desktop o da altri script di avvio della sessione e da come ciascuna distribuzione li ha impostati.


4

La variabile PATH iniziale è di solito impostata in /etc/profile A volte un amministratore di sistema inserirà anche le variabili PATH nella sorgente/etc/profile.d

Questi sono i varchi PATH di sistema che tutti gli utenti che hanno effettuato l'accesso ereditano per impostazione predefinita (a meno che non vengano sovrascritti localmente). Questo di solito stabilisce percorsi ovvi, come /usr/bin, sebbene nel mio lavoro utilizziamo /opte alcune posizioni personalizzate ampiamente, quindi anche quelli sono impostati lì.

In base agli account di accesso per utente, PATH può anche essere definito in ~/.profile. Ciò potrebbe definire cose a cui non tutti gli utenti hanno accesso; forse i capi dipartimento possono eseguire file binari /optma altri utenti non sono infastiditi da questi file binari. Gli utenti possono anche modificare quel file da soli, e la cosa bella .profileè che non è specifico della shell; se accedi, il PATH impostato lì viene fornito.

Per gli accessi shell-specifici, percorso può essere definito ~/.bash_profile, ~/.bashrco .cshrc, o simili. Gli utenti possono impostare PATH qui se desiderano percorsi specifici per shell specifiche o se riescono a mantenere lì tutte le loro preferenze personali.

In sintesi: / etc / profile e /etc/profile.d sono impostazioni tradizionalmente a cascata; vengono ereditati e di solito vengono aggiunti in file dot personali (sebbene un utente possa scegliere di sovrascriverli). I file dot personali vengono generalmente impostati da un utente.

Naturalmente, una shell ha anche variabili d'ambiente, quindi una variabile d'ambiente locale può anche aggiungere o sovrascrivere il PERCORSO predefinito in uno qualsiasi dei file di configurazione.


Ho appena controllato tutti quei file che hai citato, ~ / .bash_profile e .cshrc non esistono comunque. I 3 file di script nella directory /etc/profile.d dir: appmenu-qt5.sh, bash_completion.sh & vte.sh non impostano neanche la variabile PATH. Cosa intendi con "una shell ha anche variabili d'ambiente" è il PATH predefinito impostato nel programma binario / bin / bash? Quando terminale echo $ PATH ottengo: / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / games: / usr / local / games ma non ho idea di dove tutto sia ambientato davvero.
Larry Lawless,

Penso di aver frainteso in qualche modo la tua domanda, pensavo che stessi chiedendo tutte le posizioni che PATH avrebbe potuto essere impostato, ma penso che tu sia più interessato a dove è inizialmente impostato PATH . Per quello, guarda /etc/bashrc. Questo determina come viene avviato BASH, che dovrebbe includere tutte le variabili di ambiente iniziali. Sul mio sistema, /etc/bashrclegge /etc/profile.dma sembra che tu abbia solo 3 file, /etc/profile.dquindi la tua distribuzione potrebbe farlo diversamente.
Klaatu von Schlacker,

1
In pratica voglio conoscerne i dettagli. Vorrei che Ken Thompson fosse mio padre :)
Larry Lawless,

Ci arriverai. Credetemi, dopo aver usato queste cose su base giornaliera per un po ', tutto inizia a sprofondare e finché continuate a chiedere "perché?" e leggendo documenti per le risposte, alla fine impari molto!
Klaatu von Schlacker,

In Linux Mint 18 Cinnamon assicurati di controllare /etc/profile.d/jdk_home.sh Ho rinominato questo file in jdk_home.sh.old e ora il mio percorso non continua a essere sovrascritto e posso chiamare java -version e vedere Java 9 come previsto. Anche se ho selezionato correttamente Java 9 in update-aternatives --config java questo file jdk_home.sh ha continuato a sovrascrivere $ PATH
flyingdrifter il

3

Per aggiungere alle altre risposte:

bashverrà impostato PATHsu un valore predefinito hardcoded se non è impostato nell'ambiente. Su una macchina Ubuntu Server 16.04.2 ottengo:

$ env -i bash -c 'echo $PATH'
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

Possiamo verificare che questo valore sia effettivamente codificato, e non letto dall'ambiente o da alcuni file, usando l' stringsutilità:

$ strings /bin/bash | grep /usr/sbin
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

Tuttavia, ottengo un risultato diverso sulla mia macchina Arch Linux:

$ env -i bash -c 'echo $PATH'
/usr/local/sbin:/usr/local/bin:/usr/bin

Quindi, sembra che questo valore predefinito sia stato scelto al momento della bashcreazione del file binario, che dipende dal sistema operativo / dalla distribuzione in uso.


0

Roba che non vedo:

  • X cose
  • File master da cui .profileecc. Vengono copiati durante la creazione dell'account
  • pam_env
  • Un recente thread su Debian , dove questo è discusso in dettaglio.

Per quanto riguarda Ken Thompson potresti essere sorpreso dal suo: "Views on Linux" .

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.