Como exportar uma lista grande de variáveis no Bash? [duplicado]

6

Eu uso o Bash 4.3.48 (1) e tenho um arquivo .sh contendo cerca de 20 variáveis logo abaixo do shebang. O arquivo contém apenas variáveis.

Este é o padrão:

x="1"
y="2"
...

Eu preciso exportar todas essas variáveis de uma maneira DRY : por exemplo, um export para todos vars, em vez disso, diga 20 export para 20 vars.

Qual é a maneira mais elegante (mais curta, mais eficiente, por todos os meios) de fazer isso dentro desse arquivo?

Um loop for ? Um array ? talvez algo mais simples do que isso (algum tipo de sintaxe de açúcar de coleção)?

    
por user9303970 10.02.2018 / 21:56

2 respostas

19

Use set -a (ou o equivalente set -o allexport ) na parte superior do arquivo para ativar a opção allexport shell. Em seguida, use set +a (ou set +o allexport ) no final do arquivo (onde for apropriado) para desativar a opção allexport shell.

Usar a ativação da opção allexport shell terá o seguinte efeito (do bash manual):

Each variable or function that is created or modified is given the export attribute and marked for export to the environment of subsequent commands.

Esta opção de shell, definida com set -a ou set -o allexport , é definida em POSIX (e, portanto, deve estar disponível em todos os shells sh -like) como

When this option is on, the export attribute shall be set for each variable to which an assignment is performed; [...] If the assignment precedes a utility name in a command, the export attribute shall not persist in the current execution environment after the utility completes, with the exception that preceding one of the special built-in utilities causes the export attribute to persist after the built-in has completed. If the assignment does not precede a utility name in the command, or if the assignment is a result of the operation of the getopts or read utilities, the export attribute shall persist until the variable is unset.

As variáveis definidas enquanto esta opção está habilitada serão exportadas, isto é, transformadas em variáveis de ambiente. Essas variáveis de ambiente estarão disponíveis para o ambiente shell atual e para qualquer ambiente de processo filho criado posteriormente, como de costume.

Isso significa que você terá que

  • fonte este arquivo (usando . , ou source em shells que possuem este comando), ou
  • inicie os processos que devem ter acesso às variáveis deste arquivo.
por 10.02.2018 / 21:59
2

Aqui está um hack:

source <(sed 's/^/export /' file.sh)

Eu assumo que seu shell é como bash e suporta substituições de processos

Ou edite o arquivo em si:

sed -i 's/[^=]\+/export &; &/' file.sh
    
por 11.02.2018 / 01:57