Usando valores de variáveis definidos em um arquivo, em arquivos no mesmo diretório

3

Em este repositório do GitHub eu tenho um diretório chamado nwsm . Este diretório contém o arquivo nwsm.sh que contém um script mestre (um script que executa outros scripts).

O diretório também contém alguns outros arquivos que contêm sub-scripts que o script mestre executa, cada um de cada vez.

Em nwsm.sh declaro algumas variáveis e essas variáveis devem ser usadas dentro de todos os subscritos acima mencionados. A expansão de variável em ambos os nwsm.sh e os subscritos devem ocorrer da mesma maneira, somente em sua execução.

Note que o diretório não contém nenhum outro arquivo além de nwsm.sh e seus arquivos de sub-script, nem deve conter outros arquivos, a qualquer momento no futuro.

Expansões variáveis dentro dos índices devem ocorrer com os valores relevantes definidos em nwsm.sh , após nwsm.sh começar a ser executado.

Este é o script mestre em nwsm.sh (primeiro as declarações de variáveis com o utilitário read , depois a execução dos arquivos adjacentes):

#!/bin/bash
domain="$1" && test -z "$domain" && exit 2

read -sp "Please enter DB root password:      " dbrootp_1 && echo
read -sp "Please enter DB root password again:" dbrootp_2 && echo
if [ "$dbrootp_1" != "$dbrootp_2" ]; then echo "Values unmatched" && exit 1 fi

read -sp "Please enter DB user password:      " dbuserp_1 && echo
read -sp "Please enter DB user password again:" dbuserp_2 && echo
if [ "$dbuserp_1" != "$dbuserp_2" ]; then echo "Values unmatched" && exit 1 fi

"$PWD"/tests.sh
"$PWD"/wp-cli.sh
"$PWD"/nginx.sh
"$PWD"/dbstack.sh
"$PWD"/certbot.sh

Como posso garantir que os valores definidos em nwsm.sh estarão disponíveis para todos os seus correspondentes, enquanto .nwsm e eles estão em execução?

    
por user9303970 14.02.2018 / 16:04

2 respostas

2

Se você quer dizer que quer apenas ter as variáveis visíveis quando o script principal executa os outros scripts, então você apenas export deles:

$ cat main.sh 
#!/bin/sh
read foo
export foo
./foo.sh
$ cat foo.sh 
#!/bin/sh
echo "foo is $foo"

$ ./main.sh 
blah
foo is blah
$ 

Os outros scripts são executados como subprocessos do script principal, e export ed variáveis são passadas para eles através do ambiente. Nada disso limita as variáveis a scripts em um diretório específico, as variáveis exportadas são visíveis para todos os programas iniciados pelo script principal. Se você quer rodar algum programa sem passar as variáveis para eles, você terá que desimportá-los com export -n primeiro. Você pode também não exportar no início dos outros scripts, para evitar que eles passem as variáveis.

Observe também que não há necessidade de limpar as variáveis ou de não as exportar no final do script principal (ou dos outros). As variáveis existem apenas na memória dos processos do shell em execução e, quando o processo termina, as variáveis desaparecem.

(Passar variáveis para processos independentes, por outro lado, exigiria salvá-los em um arquivo ou algo assim.)

Naturalmente, outra maneira de obter quase o mesmo tipo de modularização seria dividir o programa em funções, armazená-las em arquivos separados e source desses arquivos do script principal. Dessa forma, todas as variáveis do programa seriam visíveis para todas as funções. (Que pode ou não ser preferível).

    
por 14.02.2018 / 17:22
0

Se você exportar suas variáveis, no final do seu script mestre, "desconfigure" as variáveis.

unset domain
unset dbrootp_1
unset dbrootp_2
unset dbuserp_1
unset dbuserp_2

unset: unset [-f] [-v] [nome ...]     Para cada NAME, remova a variável ou função correspondente. Dado     o sinalizador -v', unset will only act on variables. Given the -f ',     unset só irá atuar em funções. Com nenhuma das bandeiras, desmarque primeiro     tenta anular uma variável, e se isso falhar, então tenta cancelar     função. Algumas variáveis não podem ser desconfiguradas; veja também readonly.

    
por 14.02.2018 / 20:40