¿Cómo mostrar el valor actual de una variable de entorno?

24

Cuando verifico el entorno de mi sistema, aparecerán muchas variables ambientales. ¿Cómo puedo buscar una variable en particular?

Un libro que estoy leyendo dice:

A veces, el número de variables en su entorno crece bastante, tanto que no desea ver todos los valores que se muestran cuando está interesado en uno solo. Si este es el caso, puede usar el echocomando para mostrar el valor actual de una variable de entorno.

¿Cómo hago esto en un terminal de Linux?

iLearnSlow
fuente

Respuestas:

25

Sólo:

echo "$VARIABLENAME"

Por ejemplo, para la variable de entorno $HOME, use:

echo "$HOME"

Que luego imprime algo similar a:

/home/username

Editar : según el comentario de Stéphane Chazelas , puede ser mejor si usa en printenvlugar de echo:

printenv HOME
caos
fuente
44
Olvidó las comillas (a menos que esté dando a entender la sintaxis zsh o rc / es). echoes una mala elección de un comando, ya que podría transformar el contenido de la variable. Producirá el contenido del parámetro de shell con el mismo nombre. Eso no es necesariamente lo mismo si se usa el shell Bourne o para entornos como 1, *por ejemplo. Y no puede usar ese enfoque para los entornos cuyo nombre no es válido como nombre de variable de shell.
Stéphane Chazelas
55
También tenga en cuenta que si hay varias entradas de entorno con el mismo nombre (OK, un caso patológico), cuál obtendrá depende del shell (por lo general, el primero o el último). printenv VARlos mostrará a todos (al menos para la implementación de GNU).
Stéphane Chazelas
5

Es importante comprender que cada proceso tiene su propio conjunto de variables de entorno.

Cuando un proceso llama a la fork()llamada del sistema, se crea un segundo proceso (el hijo ) idéntico al primero ( el padre ) (esta copia incluye el entorno, que reside justo encima de la pila (o justo debajo, dependiendo de cómo piense en las pilas :-)) pero en unix / linux la pila crece hacia abajo desde las direcciones de altura).

Por lo general, el proceso secundario llamará a la llamada del execve()sistema, que desechará todo en su memoria (virtual) y reconstruirá a partir de las secciones de código y datos en el archivo binario especificado.

Sin embargo, cuando reconstruye la pila, copia el entorno y las cadenas de argumentos pasadas a execve()la pila primero (en ese orden), antes de llamar a la main()función (gran parte del trabajo se realiza en el crt0código de arranque después de los execve()retornos (a la entrada punto especificado en el binario)).

Hay envoltorios para la execve()llamada al sistema en la biblioteca C que pasará el entorno actual (es decir, una copia del entorno de los padres), en lugar de que la persona que lo llama lo proporcione (de modo que el hijo heredará el entorno de los padres) - vea environ(7).

Intente ejecutar (como root) el comando ps axeww | less... ¡esto le mostrará el entorno para todos los procesos! Una interesante es la identificación del proceso 1 (es decir, lainit proceso: el primer proceso creado por el núcleo en el momento del arranque).

Si desea ver el entorno para un proceso específico (y sabe que es la identificación del proceso), intente ejecutar el comando cat /proc/<PID>/environ(reemplazar <PID>con la identificación del proceso).

Tenga en cuenta que si un proceso tiene suficientes privilegios, puede reescribir su propia pila, lo que puede dificultar saber cuál es su entorno: verá algunos procesos de daemon como este en la salida ps.

Pero al final, todo este waffle se reduce a lo que @chaos dijo anteriormente, si desea ver el valor actual de una variable de entorno específica en su proceso de shell, simplemente use el comando echo "$<NAME>"( incorporado) (reemplazando <NAME>con el nombre del variable de entorno que le interese) ... solo tenga en cuenta que la misma variable puede tener un valor diferente, o no existir, en otro proceso.

Murray Jensen
fuente
1
(1) Tenga en cuenta que la eopción psy el /proc/…/environarchivo especial pueden no existir en todos los sistemas. (2) AFAIK, cada proceso de Unix tiene el privilegio de reescribir su pila y modificar sus variables de entorno. (3) Para más discusión, vea ¿ A quién pertenecen las variables de entorno? (en Super Usuario ).
G-Man dice 'Restablecer a Monica' el
Tenía en mi cabeza que algunos sistemas tenían una manera de evitar que un proceso no privilegiado "ocultara" los argumentos de la línea de comandos y el entorno, por ejemplo, de la ejecución de la raíz ps... pero ahora que ha resaltado este punto, no puedo recordar por qué pensaba que.
Murray Jensen
@MurrayJensen de acuerdo con alguna discusión sobre la pregunta altamente votada que hice sobre "curl" ocultando sus argumentos en ps: no se especifica en POSIX si ps devuelve los argumentos como pasaron originalmente al proceso, o una copia que el proceso puede haber modificado después de él empezó. Algún sistema (creo que Solaris ??) muestra los argumentos originales sin importar qué. (Aquí está el enlace). Esto puede haber sido lo que estabas pensando. :)
Comodín
¡Bingo! Sí, por supuesto, Solaris hace esto "correctamente" :-) Gracias por la actualización ...
Murray Jensen
1

Puede obtener lo que está buscando con export:

export | grep HOME

Mostrará el contenido de la $HOMEvariable.

Darth Egregious
fuente
1

si tiene que configurar muchos vars:

  ( set -o posix ; set ) | sort >~/vars.before

después de haberlos configurado:

  ( set -o posix ; set ) | sort >~/vars.after

que mostrar lo que se ha configurado:

  comm -3 ~/vars.before ~/vars.after | perl -ne 's#\s+##g;print "\n $_ "'

De esta manera, pronto se encontrará trabajando con varios conjuntos de vars de shell predefinidos en archivos cnf, que combinados con tmux lo convertirán en el maestro de la gestión de la configuración en entornos de shell:

  # ---------------------------------------------------------
  # cat cnf/qto.dev.host-name.cnf
  # [MainSection]
  # postgres_db_name     = dev_qto
  # postgres_db_host     = host-name
  #
  # call by: doParseCnfEnvVars cnf/qto.dev.host-name.cnf
  # ---------------------------------------------------------
  doParseCnfEnvVars(){

     cnf_file=$1;shift 1;
     test -z "$cnf_file" && echo " you should set the cnf_file !!!"

     INI_SECTION=MainSection

     ( set -o posix ; set ) | sort >~/vars.before

     eval `sed -e 's/[[:space:]]*\=[[:space:]]*/=/g' \
        -e 's/#.*$//' \
        -e 's/[[:space:]]*$//' \
        -e 's/^[[:space:]]*//' \
        -e "s/^\(.*\)=\([^\"']*\)$/export \1=\"\2\"/" \
        < $cnf_file \
        | sed -n -e "/^\[$INI_SECTION\]/,/^\s*\[/{/^[^#].*\=.*/p;}"`

     # and post-register for nice logging
     ( set -o posix ; set ) | sort >~/vars.after

     echo "INFO added the following vars from section: [$INI_SECTION]"
     comm -3 ~/vars.before ~/vars.after | perl -ne 's#\s+##g;print "\n $_ "'
  }
Yordan Georgiev
fuente