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

1

Por exemplo, se eu fizer uma expansão de parâmetro :

$ b=1
$ echo $b
1

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

    
por Niklas Rosencrantz 23.05.2016 / 05:07

3 respostas

2

O shell que está sendo executado quando você efetua 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 comando set para ver uma lista das variáveis. O comando set é executado dentro do shell, em vez de iniciar um novo processo.

Variáveis de ambiente são mantidas em um espaço separado ou sinalizadas como tal (se for importante, então leia o código-fonte do shell) para que elas sejam passadas ao longo dos programas que estão sendo executados pelo shell.

Usar dois hashtables parece razoável para mim.

    
por 23.05.2016 / 06:08
2

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

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

Agora, imagine que você está fazendo isso em um terminal e saindo dessa sessão de terminal. Abrir outra sessão de terminal não mostrará nada em relação à atribuição b=1 na sessão anterior.

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

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

set |grep '^b='

b=1

Por favor, veja O Projeto de Documentação do Linux para mais informações.

    
por 23.05.2016 / 05:39
1

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

A diferença entre as variáveis do shell e as 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 do shell. A maneira natural de armazená-los é criar uma tabela de hash que mapeie nomes de variáveis não para um valor, mas para uma estrutura que contenha um valor e alguns sinalizadores (exportados, somente leitura,…).

    
por 24.05.2016 / 02:31