Header Ads

Exportando variáveis ​​no Bash: por que e como

Exportando variáveis ​​no Bash; por que isso é feito e como pode ser bem feito? Este artigo ensinará você sobre subshells e exemplificará a exportação de variáveis ​​Bash com eles, mostrando como exportar variáveis ​​e como evitar erros.

Exportando variáveis ​​no Bash

Ao desenvolver scripts mais complexos no Bash, que empregam, por exemplo, configurações de subshell e multi-threaded e / ou processos em segundo plano, será necessário passar variáveis ​​regularmente do shell mestre para um subshell. É exatamente nesse tipo de situação que a exportação de variáveis ​​de shell torna-se interessante.

O que é um subshell Bash?

Um subshell Bash, ou um shell filho, nada mais é do que um interpretador de linha de comando Bash (em outras palavras, o shell Bash) reiniciado de dentro de si mesmo. O processo original tornou-se, portanto, o processo mestre, e o segundo processo a ser iniciado (aquele iniciado dentro do processo mestre, ou primeiro processo) será o subshell. Se o processo mestre / shell terminar, o subshell em execução nele também terminará.

Vamos fazer isso de maneira muito simples, da seguinte maneira:

 bash echo $$ ps -ef | grep -v grep | grep your_process_id 

Nada parecia acontecer quando digitamos bash no terminal e pressionamos enter. No entanto, o que aconteceu em segundo plano foi que um novo processo (o subshell) foi iniciado e imediatamente entramos nele.

Podemos verificar o mesmo verificando que tipo de processos estão ativos. Primeiro, descobrimos o PID (ID do processo) de nosso (sub) shell atual. Podemos fazer isso inspecionando a variável $$ com echo. O PID é 362827. Em seguida, podemos nossa lista de processos usando ps -ef e excluímos o processo grep da lista com a negação grep -v em | grep -v grep.

Descobrimos que o PPID (o ID do processo pai) de nosso subshell com PID 362827 é 362815 (primeira caixa verde). O PID (o ID do processo do programa mencionado no final da linha) é sempre exibido à esquerda, enquanto o ID do processo pai (PPID) é sempre exibido à direita. Isso nos permite voltar o mais longe que podemos ou queremos ir.

Assim, descobrimos que o processo 362815 (o processo principal / pai que hospeda o subshell 362827) é de propriedade do processo 13185 (destaque branco), e este processo é identificado pelo último ps como a janela do terminal que foi iniciada no ambiente de trabalho. Este, por sua vez, pertence a um processo iniciado muito mais cedo 2184 (nome do processo não mostrado aqui) etc.

A hierarquia total (visível) é, portanto, 2184 > 13185 (janela de terminal) > 362815 (shell mestre / principal dentro da janela do terminal) > 362827 (o subshell começou a partir do shell Bash com o ID de processo 362815). Para uma representação mais visível dessa hierarquia, você pode verificar o comando / utilitário pstree, que pode exigir a instalação em seu sistema operacional.

Para saber mais sobre Unix PID &’ s, consulte O que são Unix PIDs e como eles funcionam? por Anthony Heddings.

É importante entender como a hierarquia do Bash funciona, pois nos ajuda a entender por que e onde a exportação de variáveis ​​se torna interessante e muitas vezes necessária.

Exportando variáveis ​​para subshells

Existem muitas maneiras de criar um subshell. Uma maneira é simplesmente iniciar um subshell conforme mostrado acima, digitando bash e executando outros comandos baseados na linha de comando. Outra é iniciar uma sessão de tela GNU (veja Como usar o utilitário GNU Screen no Linux se quiser aprender mais sobre a tela GNU).

Você também pode usar o idioma do subshell $ (subshell code vai aqui) diretamente de uma linha de comando e / ou de seus scripts Bash. Finalmente, pode-se iniciar um subshell simplesmente colocando um processo em segundo plano. Para saber mais sobre o gerenciamento de processos em segundo plano, consulte Bash Background Process Management.

Então, com todos esses métodos para iniciar subshells, como alguém pode facilmente passar variáveis ​​de um shell para outro? Claro, pode-se armazenar as variáveis ​​em um arquivo (em qualquer formato), mas isso aumentará o número de operações de E / S e a complexidade do código Bash que lida com essa gravação e leitura de variáveis.

Existe uma maneira mais fácil. Você pode pensar nisso como variáveis ​​globais em outras linguagens de codificação. Sim, talvez as variáveis ​​globais tendam a ser evitadas ou desaprovadas, mas lembre-se de que estamos lidando com processos separados aqui.

Em qualquer programação multi-thread / multi-processo em qualquer linguagem, ainda haveria um módulo / código de supervisão que passaria variáveis ​​de um lado para outro entre as threads. Essas variáveis ​​também podem ser consideradas globais.

A sintaxe do comando de exportação é muito simples. Simplesmente prefixe a atribuição da variável com o comando export:

 exportar A = 1 B = 2 bash echo $ echo $ 

Aqui iniciamos um subshell e mostramos como a variável A foi corretamente passada para o subshell usando o comando export ao defini-lo. Também vemos como a variável B não foi transferida para o subshell, pois foi definida sem usar export.

A propriedade export é uma propriedade específica que pode ser ativada e desativada para uma determinada variável. Ele é facilmente ativado usando o prefixo do comando export ao definir a variável.

Depois que essa propriedade é definida, ela permanece ativa. Isso é algo a se observar ao codificar, pois pode levar a resultados confusos se a pessoa não conhecer essa operação específica. É fácil presumir que alguém está “ reutilizando ” uma variável com o mesmo nome, ou mesmo para usar acidentalmente um nome de variável semelhante de scripts diferentes no subshell, etc. Vamos explorar um exemplo:

 exportação C = 1 exportação D = D = 1 bash echo $ echo $ 

Neste exemplo, vemos que a variável D retém sua propriedade de exportação, mesmo quando reatribuída sem o comando de exportação explícito, e seu valor é passado corretamente para o subshell.

A propriedade de exportação também pode ser removida / desativada para uma variável, usando a opção -n para exportar. No entanto, para ser eficaz, isso deve ser feito a partir do shell mestre / principal, e não do subshell:

 exportar -n D echo $ exit echo $ bash echo $ 

Este exemplo continua a partir do último (ou seja, ainda de dentro do subshell ativo). Tentamos remover a propriedade export da variável D e, subsequentemente, sair do subshell usando exit. Vemos que, ao retornar ao shell principal, nossa variável D reteve seu valor e esse valor permanece retido ao entrar novamente em um novo subshell. Assim, como visto, uma propriedade de exportação não pode ser removida de uma variável de um subshell se essa variável recebeu uma propriedade de exportação no shell principal / mestre.

É semelhante a outros métodos de codificação Bash: o subshell não pode afetar o shell mestre / principal. Isso também faz mais sentido do ponto de vista da segurança em muitos casos, e a segurança é provavelmente o motivo pelo qual os desenvolvedores do Bash escolheram implementá-la dessa maneira. Vamos dar um passo adiante agora e remover a propriedade de exportação do shell principal / pai:

 sair da exportação -n D bash echo $ 

Aqui, saímos do subshell criado no último exemplo e, em seguida, removemos a definição da propriedade de exportação da variável D. Em seguida, inserimos novamente uma subcamada semelhante ao nosso último exemplo e podemos ver que nossa variável D está vazia, pois não foi mais exportada para a subcamada. Você também pode executar export -p para ver todas as variáveis ​​de exportação. As variáveis ​​que você exportou provavelmente estão no topo desta lista.

 exportar -p | head -n1 

Conclusão

Tendo explorado os subshells e sua conexão com a exportação de variáveis ​​Bash, exemplificamos a seguir a exportação de variáveis ​​Bash. Vimos várias maneiras de exportar variáveis, bem como um método para limpar a propriedade de exportação das variáveis. Também vimos uma pegadinha que pode surgir se você reutilizar nomes de variáveis. Aproveite a exportação!

Nenhum comentário