Alcance de una variable exportada en shell

Digamos que tengo un script donde exporté una variable como se ve a continuación:

#!/bin/bash foo(){ eval export one=1 } foo1(){ eval export two=2 } (foo) foo1 echo "one=$one" echo "two=$two" 

Sin embargo, obtuve el siguiente resultado:

 root@centos1:~>/tmp/test.sh one= two=2 

¿Cuál es la razón por la que no puedo ver el valor de $one y puedo ver $two ?

Las variables globales viven desde el momento en que están configuradas hasta el momento en que se desactivan o el process finaliza. Las variables globales (ni locales) no son henetworkingadas por processs secundarios no relacionados (si el process secundario es una bifurcación (una subshell), entonces obtiene una copy de todo: exportada o no exportada).

Las variables globales exportadas son como variables globales, pero también son henetworkingadas automáticamente (como parte del entorno de process) por processs secundarios, incluso no relacionados. (Con las exportaciones, puede pasar una variable como CXXFLAGS a un process como make , que definitivamente no es una subcapa de su caparazón, y cada process que genera genera también esa variable).

En su ejemplo () crea una subshell, que obtiene una copy de todo. El command foo modifica la subshell agregando una variable exportada y luego la subshell termina sin utilizar la variable exportada (ningún nieto lo henetworkingó). Ahora, ninguna información viaja implícitamente desde processs secundarios a processs principales. Lo que hacen los niños en su entorno no afecta a sus padres. Esa es la razón por la cual tu variable está desarmada.


Por cierto, esas eval son una eval innecesaria en este context.

Encerrar un command entre ( ) dará como resultado que el command esté en un subset.

Esto puede ser útil si uno debe canalizar o salir.

 ( date ; cmd1 ; cmd2 ) | grep ... 

resultará de concatenar los primeros 3 commands y dar salida a grep (en este caso).

Puede considerar {} , así como también leer la página del manual para bash

  (list) list is executed in a subshell environment (see COMMAND EXECUTION ENVIRONMENT below). Variable assignments and builtin commands that affect the shell's environment do not remain in effect after the command completes. The return status is the exit status of list. { list; } list is simply executed in the current shell environment. list must be terminated with a newline or semicolon. This is known as a group command. The return status is the exit status of list. Note that unlike the metacharacters ( and ), { and } are reserved words and must occur where a reseved word is permitted to be recognized. Since they do not cause a word break, they must be separated from list by whitespace or another shell metacharacter.