¿Qué más puede fallar si elimino la exportación de una variable?

¿Qué más puede fallar si elimino la exportación de una variable?

Mi problema es que cuando comencé a codificar mi script encontré varios problemas de alcance de variables que resultaron en el mal hábito de exportar casi todas mis variables.

Ahora que mi código se ha vuelto bastante grande, estaba pensando en limpiarlo y parte de eso es eliminar un montón de exportaciones inútiles. Lamentablemente, no estoy seguro de si mis conocimientos sobre el alcance de las variables son completos. Incluso después de leer algunas páginas sobre el tema.

Lo que sé (y espero que sea correcto):

1-Exportar una variable hace que su contenido esté disponible para los procesos de subcapa:

export myvar="content"

2-Las cosas hechas entre paréntesis como esta se verán afectadas al eliminar las exportaciones (por lo que tengo entendido, esta es la única forma de declarar/usar una subcapa):

$(grep "content" <<< $myvar)

3-Las variables declaradas sin establecer su alcance son globales:

myvar="content"

4-Como no declaro ninguna variable local, no tengo que preocuparme por causar problemas dentro de mis funciones:

local myvar="i don't use this"

Preguntas:

1- ¿Tiene algún sentido continuar con la eliminación de las exportaciones inútiles junto a mi código que no apesta a novato obvio?

2- Si sigo adelante, ¿hay algo más que deba tener en cuenta que pueda verse afectado y romper mi código? ¿O hay alguno de mis conocimientos incorrecto/incompleto?

3- Si conoce una referencia de alcance variable bien escrita (y completa), comparta el enlace.

Respuesta1

Puede eliminar todas las exportaciones sin ningún efecto en las variables exportadas, siempre y cuando no utilice exportla evaluación dos veces. Por evaluar dos veces quiero decir:

var1=var2 
export "${var1}=var3"
echo "$var2"
var3

En su lugar, simplemente use:

set -a 

...en la parte superior del guión. Todas las variables definidas a partir de entonces serán automáticas exported, lo que incluiría variables que quizás no haya exporteditado previamente. Alternativamente, solo puede set -ausar una parte del script y luego set +adesarmarlo; también podría funcionar como función.

Pero los subniveles heredan automáticamente valores de variables de todos modos, por lo que:

var1=value
( echo "$(echo "$var1")" )
value

exportNo hace ninguna diferencia en ese caso.

Pero si su secuencia de comandos llama a otra secuencia de comandos, o cualquier otro ejecutable que interprete los valores que ha editado exporty deja de utilizarlos export, entonces esos valores ya no estarán disponibles en su entorno. En el siguiente ejemplo, utilizo la variable de shell $PS1, que define el contenido de un mensaje de shell interactivo, para demostrar cómo las variaciones en exportlas variables ed afectan los procesos secundarios.

export PS1="$(printf "this is another executable\n > ")"
echo exit | sh -i

###OUTPUT###

this is another executable
 > exit
exit

Pero ...

PS1="$(printf "this is another executable\n > ")"
echo exit | sh -i

###OUTPUT###

sh-4.3$ exit
exit

Pero, de nuevo, si declaras explícitamente variables de entorno mientras invocas un proceso...

PS1="$(printf "this is another executable\n > ")"
{
echo exit | PS1=$PS1 sh -i
echo exit | sh -i
}

###OUTPUT###

this is another executable
 > exit
exit
sh-4.3$ exit
exit

información relacionada