Como tornar as variáveis acessíveis a partir de scripts [closed]

0

No Ubuntu 16.04 eu executei um script (script 1) que por si só executa dois outros scripts (script 2 e script 3).

O Script 3 contém uma substituição de variável ( ${x} ) para uma variável já declarada no script 2 ( x=y ).

É claro que, antes de executar o script 3, certifiquei-me de source script 2, para que a futura substituição de variável fosse permitida no script 3 ou de outra forma.

O problema é que, quando executo o script 3 (através do script 1), a substituição da variável falha e o resultado é imperfeito, mas em uma execução manual é bem-sucedido.

Por que a substituição de variáveis falha quando o script 3 é executado através do script 1, mas tem sucesso na execução manual e como ter certeza de que realmente ocorrerá?

Se sourcing do script 2 não for suficiente, bem, não tenho ideia do que é.

    
por user273439 31.01.2018 / 03:37

1 resposta

4

Este é um problema de escopo variável e não tem absolutamente nada a ver com a execução manual de um script a partir da linha de comando ou a execução de outro script.

As variáveis do shell que não são exportadas para o ambiente não são visíveis para processos filhos (incluindo shells filho)

Se você estiver obtendo script2 dentro de script3 , então script3 verá todas as variáveis definidas em script2 , porque tudo acontece dentro do escopo de script3 . É praticamente o mesmo se você contratar script2 e script3 dentro de script1 (mas, nesse caso, tudo acontece dentro do escopo de script1 )

Se, no entanto, você estiver pesquisando script2 dentro de script1 e, em seguida, executando ( não sourcing) script3 de script1 , então script3 verá apenas variáveis definidas ou alterado em script2 se eles forem exportados.

Realmente não importa quando ou onde as variáveis são exportadas, desde que aconteça antes de script3 ser executado. As variáveis podem ser exportadas em script1 ou em script2 , ou até mesmo no shell pai (ou em seu .profile / .bashrc / etc) que executou script1 para começar.

    
por 31.01.2018 / 05:30