Где хранятся переменные оболочки?

Где хранятся переменные оболочки?

Например, если я сделаюрасширение параметра:

$ b=1
$ echo $b
1

Где bхранится внутри? Я проверил, и это не переменная окружения, потому что она не указана в списке printenv. Я пишу собственную оболочку для изучения Unix и использовал хеш-таблицу для хранения и извлечения переменной в качестве «таблицы поиска символов» — это хороший метод или вы могли бы мне предложить какой-то другой способ?

решение1

Оболочка, запущенная при входе в систему для чтения команд и их выполнения, сохраняет все переменные. Если вы запустите вторую оболочку, то у нее будет свой собственный набор переменных. Вы можете запустить команду, setчтобы увидеть список переменных. setКоманда запускается внутри оболочки вместо запуска нового процесса.

Переменные среды либо хранятся в отдельном пространстве, либо помечаются как таковые (если это имеет значение, прочтите исходный код оболочки), чтобы они передавались программам, запускаемым оболочкой.

Использование двух хеш-таблиц кажется мне разумным.

решение2

Это всего лишь переменная на время выполнения программы. Другой способ думать об этом — переписать вашу программу следующим образом.

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

Теперь представьте, что вы делаете это в терминале, а затем выходите из этого сеанса терминала. Открытие другого сеанса терминала не покажет вамчто-либоотносительно этого b=1задания на предыдущей сессии.

Это называется "локальная переменная", в отличие от "глобальной переменной". Они отображаются, как и многие другие функции, с помощью set.

Итак, если вы хотите увидеть задание, сделайте это.

set |grep '^b='

b=1

Пожалуйста, посмотриПроект документации LinuxЧтобы получить больше информации.

решение3

Переменные оболочки хранятся в памяти запущенной оболочки. Используйте любую структуру данных, которая позволяет легко находить элемент по его имени; хорошим выбором будет хэш-таблица.

Разница между переменными оболочки и переменными окружения заключается в том, что переменные окружения размещаются в среде подпроцессов. Все переменные окружения являются переменными оболочки. Естественным способом их хранения является создание хэш-таблицы, которая сопоставляет имена переменных не со значением, а со структурой, содержащей значение и некоторые флаги (экспортируемый, только для чтения, …).

Связанный контент