Onde as variáveis ​​​​do shell são armazenadas?

Onde as variáveis ​​​​do shell são armazenadas?

Por exemplo, se eu fizer umexpansão de parâmetros:

$ b=1
$ echo $b
1

Onde é barmazenado internamente? Eu verifiquei e não é uma variável de ambiente porque não está listada por printenv. Estou escrevendo meu próprio shell para aprender Unix e usei uma tabela hash para armazenar e recuperar variáveis ​​​​como uma "tabela de pesquisa de símbolos" - esse método é um bom método ou você me sugeriria alguma outra maneira?

Responder1

O shell que está sendo executado quando você faz login para ler seus comandos e executá-los mantém todas as variáveis. Se você executar um segundo shell, ele terá sua própria coleção de variáveis. Você pode executar o setcomando para ver uma lista das variáveis. O setcomando é executado dentro do shell em vez de iniciar um novo processo.

As variáveis ​​de ambiente são mantidas em um espaço separado ou sinalizadas como tal (se for importante, leia o código-fonte do shell) para que sejam transmitidas aos programas executados pelo shell.

Usar duas tabelas hash parece razoável para mim.

Responder2

É apenas uma variável durante a execução do programa. Outra maneira de pensar sobre isso é reescrever seu programa da seguinte forma.

#!/bin/bash
b=1
echo $b
exit

Agora, imagine que você está fazendo isso em um terminal e saindo da sessão do terminal. Abrir outra sessão de terminal não mostraráqualquer coisasobre essa b=1tarefa na sessão anterior.

Isso é chamado de "variável local", em oposição a uma "variável global". Eles são exibidos, junto com muitas outras funções, usando set.

Então, se você quiser ver a tarefa, faça

set |grep '^b='

b=1

Por favor, vejaO Projeto de Documentação LinuxPara maiores informações.

Responder3

Variáveis ​​do shell são armazenadas na memória do shell em execução. Use qualquer estrutura de dados que permita pesquisar facilmente um item com seu nome; uma tabela hash é uma boa escolha.

A diferença entre variáveis ​​de shell e variáveis ​​de ambiente é que as variáveis ​​de ambiente são colocadas no ambiente de subprocessos. Todas as variáveis ​​de ambiente são variáveis ​​de shell. A maneira natural de armazená-los é fazer uma tabela hash que mapeie nomes de variáveis ​​não para um valor, mas para uma estrutura contendo um valor e alguns sinalizadores (exportados, somente leitura,…).

informação relacionada