Come determinare da dove proviene una variabile d'ambiente?


154

Ho un'istanza di Linux che ho configurato qualche tempo fa. Quando lo accendo e accedo perché rootci sono alcune variabili di ambiente che ho impostato ma non riesco a ricordare o trovare da dove provengono.

  • Ho controllato ~/.bash_profile, /etc/.bash_rce tutti gli script di avvio.
  • Ho corso finde grepinutilmente.

Mi sento come se stessi dimenticando di guardare in qualche posto ovvio. C'è un trucco per capirlo?


6
/etc/environmentè un altro.
derobert,

8
E i /etc/env.d/*file. Ma fare grep -R "YOUR_VARIABLE" /etc/è probabilmente il modo migliore per scoprirlo.
rozcietrzewiacz,


@rozcietrzewiacz nel modo più semplice ... se la variabile si trova effettivamente da qualche parte sotto / etc / (come nel mio caso); se lo pubblichi come risposta, voterei;)
Riga

Risposte:


55

Se si utilizza il envcomando per visualizzare le variabili, queste dovrebbero apparire all'incirca nell'ordine in cui sono state create. Puoi usarlo come guida se sono stati impostati dal sistema molto presto nel boot, o da un successivo .profile o altro file di configurazione. Nella mia esperienza, i comandi sete exportordineranno le loro variabili in ordine alfabetico, quindi l'elenco non è così utile.


1
È fantastico ... tranne che sto cercando di scoprire cosa cancella una variabile d'ambiente (impostata in / etc / environment). :-) (E sì, inizialmente è stato impostato ... Sto aggiungendo righe negli script in vari per registrare dove viene cancellato ...)
Michael Scheper

128

Se zshè la shell di accesso:

zsh -xl

Con bash:

PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>&2

Ciò simulerà una shell di login e mostrerà tutto ciò che viene fatto (tranne nelle aree in cui viene reindirizzato stderr zsh) insieme al nome del file attualmente interpretato.

Quindi tutto ciò che devi fare è cercare il nome della variabile di ambiente in quell'output. (puoi usare il scriptcomando per aiutarti a memorizzare l'intero output della sessione della shell, o per l' bashapproccio, usa 7> file.loginvece di 7>&2memorizzare l' xtraceoutput file.loginvece che sul terminale).

Se la tua variabile non è presente, probabilmente la shell l'ha ereditata all'avvio, quindi è stata impostata prima come nella configurazione PAM, in ~/.ssh/environment, o cose lette all'avvio della sessione X11 ( ~/.xinitrc, ~/.xsession) o impostata sulla definizione del servizio che ha avviato il tuo login manager o anche prima in alcuni script di avvio. Quindi un find /etc -type f -exec grep -F THE_VAR {} +aiuto.


4
Impressionante e utile, grazie. Per noi n00bs, spiegheresti un po 'di più sulla modalità e come possiamo uscire dalla modalità che ci mette? Ad esempio, non possiamo semplicemente convogliare grep questo output.
Geoffrey Hale,

5
@GeoffreyHale se zsh -xl 2>&1, per esempio, unisci le uscite stderr e stdout, puoi grep come al solito.
Rakesh,

1
C'è un modo per farlo con la fishshell?
Nick Sweeting,

Anche se lo uso zsh -xl 2>&1, in qualche modo non posso fare grep normalmente. Apparentemente l'output non contiene newline o qualcosa del genere.
Xerus il

Penso che potresti semplicemente usare PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>/tmp/$(uuidgen), quindi grep anche su quel file casuale.
bd1251252

51

Alcuni posti in cui guardare prima:

Sistema largo

  • /etc/environment: specifico per variabili d'ambiente
  • /etc/env.d/*: variabili di ambiente, suddivise in più file
  • /etc/profile: tutti i tipi di script di inizializzazione
  • /etc/profile.d/*: script di inizializzazione
  • /etc/bashrc, /etc/bash.bashrc: pensato per funzioni e alias

Utente specifico

  • ~/.bash_profile: inizializzazione per shell di login (bash-)
  • ~/.bashrc: inizializzazione per tutte le shell interattive (bash-)
  • ~/.profile: usato per tutte le conchiglie
  • ~/.cshrc, ~/.zshrc, ~/.tcshrc: Simile per shell non bash

31

@Cian è corretto. Oltre a usare finde grep, non c'è molto che puoi fare per scoprire da dove proviene. Sapendo che si tratta davvero di una variabile d'ambiente, proverei a focalizzare la tua ricerca in / etc / e nella tua home directory. Sostituisci VARIABLEcon la variabile appropriata che stai cercando:

$ grep -r VARIABLE /etc/*

$ grep -r VARIABLE ~/.*


1
È sorprendente che una risposta che dice "non puoi", circondata da risposte che dicono "sì, puoi", ha anche molti voti positivi.
Michael Scheper,

Non vedo alcuna risposta che in realtà dia un modo per determinare DOVE è stata impostata una variabile. Ci sono alcuni indizi utili, ma nessun one-liner che può fare il lavoro.
Andrew Wagner,

Questa cosa ha risolto il mio tempo. Grazie.
Hassan Raza,

@MichaelScheper "non puoi" farlo senza find / grep. più avanti in "puoi" viene descritto come farlo USANDO grep
Linea

23

Se inserisci il set -xtuo .profileo .bash_profile, tutti i successivi comandi della shell verranno registrati nell'errore standard e puoi vedere se uno di essi imposta queste variabili. Puoi metterlo set -xin cima anche /etc/profileper rintracciarlo. L'output può essere molto dettagliato, quindi potresti voler reindirizzarlo su un file con qualcosa di simile exec 2>/tmp/profile.log.

Se il tuo sistema utilizza PAM, cerca le pam_envrichieste di caricamento in /etc/pam.confo /etc/pam.d/*. Questo modulo carica le variabili di ambiente dai file specificati o da un valore predefinito di sistema se non viene specificato alcun file ( /etc/environmente /etc/security/pam_env.confsu Debian e Ubuntu). Un altro file con definizioni delle variabili di ambiente su Linux è /etc/login.defs(cercare le righe che iniziano con ENV_).


5

Controlla il tuo script di avvio per i file che hanno origine utilizzando .(dot) o source. Tali file potrebbero trovarsi in altre directory oltre a /etce $HOME.


2

Per gli zshutenti, può essere utile tracciare i file a cui si accede (durante l'avvio), non sono troppi e si può guardarli uno per uno per trovare dove è stato definito qualcosa.

zsh -o SOURCE_TRACE

0

le variabili d'ambiente sono memorizzate nel file / etc / profile quindi fai più / etc / profile e controlla solo le variabili env che vuoi e se / etc / profile non è presente, allora cerca il file .profile nella tua home directory


1
Le variabili di ambiente non sono memorizzate in /etc/profile, è possibile definirle lì a livello di sistema, ad esempio bashquando utilizzate come shell di login. Sono memorizzati dal processo shell dopo aver letto le definizioni dai file e / o dalla riga di comando.
Anthon,

-2

Ad esempio, se si desidera trovare la variabile HISTFILE e il suo valore o si desidera sapere quali variabili sono definite sulla cronologia, digitare questo nella shell:

set | grep HIST
env | grep HIST
printenv | grep HIST

se conosci già il nome, perché no echo "$HISTFILE":?
Jeff Schaller

perché, vogliamo trovare dove è definita la variabile $ HISTFILE. Anche se volessi sapere quali variabili sono definite nella storia
Vusal Aliyev,

2
Sfortunatamente, setnon ti dice quale file ha definito la variabile.
Jeff Schaller
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.