Например, если я сделаюрасширение параметра:
$ 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
Переменные оболочки хранятся в памяти запущенной оболочки. Используйте любую структуру данных, которая позволяет легко находить элемент по его имени; хорошим выбором будет хэш-таблица.
Разница между переменными оболочки и переменными окружения заключается в том, что переменные окружения размещаются в среде подпроцессов. Все переменные окружения являются переменными оболочки. Естественным способом их хранения является создание хэш-таблицы, которая сопоставляет имена переменных не со значением, а со структурой, содержащей значение и некоторые флаги (экспортируемый, только для чтения, …).