Diferencia entre la variable de entorno y la variable de shell

8

Se dice que las variables de entorno se heredan en los procesos secundarios, pero las variables de shell no. Sin embargo, la siguiente prueba muestra que las variables de shell se ven en el proceso secundario al igual que las variables de entorno. ¿Cuál es la diferencia?

> bash --version
GNU bash, version 3.2.39(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
> export TEST="ENV_TEST"    #env var
> sh -c "echo \$TEST"
ENV_TEST
> TEST="SHELL_TEST"         #shell var
> sh -c "echo \$TEST"       #shell var is seen in child process
SHELL_TEST
ning
fuente

Respuestas:

9

Su segunda asignación TEST="SHELL_TEST"no anula la exportación de la variable. Todavía está marcado como "para ser heredado por los niños". Y el valor heredado por el hijo es el valor establecido actualmente en el padre.
En otras palabras, su segunda asignación no revierte el estado de TESTuna variable de shell, sigue siendo una variable de entorno de acuerdo con esa terminología.

Tendría que desexportarlo para que se desactive en los procesos secundarios:

$ typeset +x TEST
$ sh -c 'echo $TEST'

$
Estera
fuente
Hola Mat, gracias por tu respuesta. Entonces, mi comprensión (hay dos variables llamadas TEST, una para la variable de entorno y otra para la variable de shell, shell var TEST sombras env var TEST.) Es incorrecta, solo hay una variable en Bash, siempre es una variable de shell y puede ser configurado para ser exportado y actúa como una variable de entorno. ¿Es esto específico para Bash y depende de la implementación, o es universal en todos los shells? Gracias.
ning
No estoy seguro acerca de "universal", pero funciona igual con bash, ksh y zsh al menos.
Mat
2
@ning Así es como funcionan todos los proyectiles modernos POSIX / Bourne (ash, ksh, bash, zsh). Hubo versiones antiguas del shell Bourne donde cambiar una variable de shell exportada no cambió el valor en el entorno, pero es poco probable que las encuentres más. Csh funciona de manera diferente, aún puede encontrarlo en entornos anticuados, pero también ha sido obsoleto por un tiempo.
Gilles 'SO- deja de ser malvado'
@Gilles Gracias por dejar en claro lo que está sucediendo y por qué. Como alguien dijo, todos los desarrolladores de Unix también deberían ser historiadores.
ning