Por exemplo, se eu fizer umexpansão de parâmetros:
$ b=1
$ echo $b
1
Onde é b
armazenado 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 set
comando para ver uma lista das variáveis. O set
comando é 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=1
tarefa 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,…).