¿Cómo determinar de dónde vino una variable de entorno?


154

Tengo una instancia de Linux que configuré hace algún tiempo. Cuando lo enciendo e inicio sesión, roothay algunas variables de entorno que configuré pero no puedo recordar ni encontrar de dónde provienen.

  • He comprobado ~/.bash_profile, /etc/.bash_rcy todos los scripts de inicio.
  • He corrido findy fue grepen vano.

Siento que debo estar olvidando mirar en algún lugar obvio. ¿Hay algún truco para resolver esto?


66
/etc/environmentEs otro.
derobert

8
Y /etc/env.d/*archivos. Pero hacer grep -R "YOUR_VARIABLE" /etc/es probablemente la mejor manera de averiguarlo.
rozcietrzewiacz


@rozcietrzewiacz de la manera más simple ... si la variable se encuentra en algún lugar debajo de / etc / (como en mi caso); si lo publicas como respuesta, votaría;)
Línea

Respuestas:


55

Si usa el envcomando para mostrar las variables, deben aparecer aproximadamente en el orden en que fueron creadas. Puede usar esto como una guía para saber si fueron establecidos por el sistema muy temprano en el arranque, o por un archivo .profile u otro archivo de configuración posterior. En mi experiencia, las sety exportlos comandos clasificará sus variables por orden alfabético, por lo que la lista no es tan útil.


1
Eso es genial ... excepto que estoy tratando de averiguar qué está borrando una variable de entorno (establecido en / etc / environment). :-) (Y sí, se está configurando inicialmente ... Estoy agregando líneas en los scripts en varios para registrar donde se borra ...)
Michael Scheper

128

Si zshes su shell de inicio de sesión:

zsh -xl

Con bash:

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

Eso simulará un shell de inicio de sesión y mostrará todo lo que se hace (excepto en las áreas donde se redirige stderr zsh) junto con el nombre del archivo que se está interpretando actualmente.

Entonces, todo lo que necesita hacer es buscar el nombre de su variable de entorno en esa salida. (puede usar el scriptcomando para ayudarlo a almacenar toda la salida de la sesión de shell, o para el bashenfoque, use en 7> file.loglugar de 7>&2almacenar la xtracesalida en file.loglugar de en el terminal).

Si su variable no está allí, entonces probablemente el shell la heredó en el inicio, por lo que se configuró antes, como en la configuración de PAM, en ~/.ssh/environment, o cosas leídas en el inicio de su sesión X11 ( ~/.xinitrc, ~/.xsession) o en la definición del servicio que inició su inicio de sesión gerente o incluso antes en algún script de arranque. Entonces a find /etc -type f -exec grep -F THE_VAR {} +puede ayudar.


44
Impresionante y servicial, gracias. Para nosotros n00bs, ¿podría explicarnos un poco más sobre el modo y cómo salimos del modo en que esto nos coloca? Por ejemplo, no podemos simplemente canalizar grep esta salida.
Geoffrey Hale

55
@GeoffreyHale si zsh -xl 2>&1, es decir, fusionar las salidas stderr y stdout, puede grep como de costumbre.
Rakesh

1
¿Hay alguna manera de hacer esto con el fishshell?
Nick Sweeting

Incluso si lo uso zsh -xl 2>&1, de alguna manera no puedo grep normalmente. Aparentemente, la salida no contiene nuevas líneas adecuadas o algo así.
Xerus

Creo que podría usar PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>/tmp/$(uuidgen), luego grep en ese archivo aleatorio también.
bd1251252

51

Algunos lugares para buscar primero:

Sistema de ancho

  • /etc/environment: específicamente destinado a variables de entorno
  • /etc/env.d/*: variables de entorno, divididas en múltiples archivos
  • /etc/profile: todos los tipos de scripts de inicialización
  • /etc/profile.d/*: guiones de inicialización
  • /etc/bashrc, /etc/bash.bashrc: destinado a funciones y alias

Usuario específico

  • ~/.bash_profile: inicialización para shells de inicio de sesión (bash-)
  • ~/.bashrc: inicialización para todos los shells interactivos (bash-)
  • ~/.profile: utilizado para todos los depósitos
  • ~/.cshrc, ~/.zshrc, ~/.tcshrc: Similar para proyectiles no de bash

31

@Cian es correcto. Aparte de usar findy grep, no hay mucho que puedas hacer para descubrir de dónde vino. Sabiendo que de hecho es una variable de entorno, intentaría enfocar su búsqueda en / etc / y su directorio de inicio. Reemplace VARIABLEcon la variable apropiada que está buscando:

$ grep -r VARIABLE /etc/*

$ grep -r VARIABLE ~/.*


1
Es sorprendente que una respuesta que diga 'no puedes', rodeada de respuestas que digan 'sí puedes', tenga incluso tantos votos a favor.
Michael Scheper

No veo ninguna respuesta que realmente dé una forma de determinar DÓNDE se configuró una variable. Hay algunas pistas útiles, pero no hay una sola línea que pueda hacer el trabajo.
Andrew Wagner

Esta cosa resolvió mi tiempo. Gracias
Hassan Raza

@MichaelScheper "no puedes" hacerlo sin encontrar / grep. más adelante en "you can" se describe cómo hacerlo USANDO grep
Línea

23

Si coloca set -xsu .profileo .bash_profile, todos los comandos de shell posteriores se registrarán en el error estándar y podrá ver si uno de ellos establece estas variables. También puede colocarlo set -xen la parte superior /etc/profilepara rastrearlo. El resultado puede ser muy detallado, por lo que es posible que desee redirigirlo a un archivo con algo parecido exec 2>/tmp/profile.log.

Si su sistema usa PAM, busque pam_envsolicitudes de carga en /etc/pam.confo /etc/pam.d/*. Este módulo carga variables de entorno de los archivos especificados, o de un sistema predeterminado si no se especifica ningún archivo ( /etc/environmenty /etc/security/pam_env.confen Debian y Ubuntu). Otro archivo con definiciones de variables de entorno en Linux es /etc/login.defs(busque líneas que comiencen por ENV_).


5

Verifique en sus scripts de inicio los archivos que obtienen usando .(punto) o source. Esos archivos podrían estar en otros directorios además de /etcy $HOME.


2

Para los zshusuarios, el rastreo de los archivos a los que se accede (durante el inicio) puede ser útil, no son demasiados y uno puede revisarlos uno por uno para encontrar dónde se definió algo.

zsh -o SOURCE_TRACE

0

las variables de entorno se almacenan en el archivo / etc / profile, así que haga más / etc / profile y simplemente verifique las variables env que desee y si / etc / profile no está presente, busque el archivo .profile en su directorio de inicio


1
Las variables de entorno no se almacenan /etc/profile, puede definirlas en todo el sistema, por ejemplo, bashcuando se usa como un shell de inicio de sesión. El proceso de shell los almacena después de leer las definiciones de los archivos y / o la línea de comandos.
Anthon

-2

Por ejemplo, si desea encontrar la variable HISTFILE y su valor o desea saber qué variables se definen sobre el historial, escriba esto en el shell:

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

si ya sabes el nombre, ¿por qué no echo "$HISTFILE"?
Jeff Schaller

porque, queremos encontrar dónde se define la variable $ HISTFILE. Además, si quisiera saber qué variables se definen sobre la historia
Vusal Aliyev

2
Desafortunadamente, setno le dice qué archivo definió la variable.
Jeff Schaller
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.