Если речь идет только о переменных в Bash (вопрос помечен как bash), этот вопрос Ask Ubuntu является хорошей отправной точкой:
Вы можете видеть все переменные с помощью встроенного declare
.
declare -p
Если вас интересуют только переменные окружения, используйте
declare -xp
Запустите help declare
чтобы увидеть другие варианты.
Выходные данные имеют правильный синтаксис для получения, поэтому возникает следующее решение:
В исходной сессии Bash запустите
declare -p > ~/some_file
В целевой сессии Bash запустите
. ~/some_file 2>/dev/null
Заметки:
- Некоторые переменные (например,
PPID
или помеченные declare -r
) доступны только для чтения, и вы получите несколько предупреждений, если попытаетесь установить их в целевой сессии без 2>/dev/null
. Это перенаправление существует только для подавления таких предупреждений. Переменные, которые были прочитаны только в целевом сеансе, останутся без изменений.
- Почти любая переменная, существовавшая в целевом сеансе и в файле, будет перезаписана значением из файла. Исключения:
- переменные, уже помеченные как только для чтения в целевой оболочке;
- специальные переменные типа
GROUPS
или RANDOM
(подробности смотрите в man 1 bash
); насколько я знаю, declare -p
обрабатывает их по-разному, поэтому они остаются особенными в целевой оболочке.
Любая переменная, которая существовала в целевом сеансе, но не в файле, останется без изменений.
Чтобы избавиться от (почти) как можно большего количества "старых" переменных в целевой оболочке, используйте эту команду перед поиском файла:
exec env -i bash --noprofile --norc
Он запускает bash
который не читает ни файлы запуска, ни файлы инициализации (--noprofile --norc
) в пустой среде (env -i
). Более того, новый bash
заменяет текущую оболочку (exec
), поэтому два процесса не складываются излишне (при условии, что текущая целевая оболочка в любом случае расходуется).
Фактически вы можете запустить новый bash
и сделать его источником файла одной командой:
exec env -i bash --noprofile --rcfile ~/some_file
Таким образом, в целом целевой сеанс не станет точной копией. Тем не менее, если все, что вам нужно, это передать переменные, которые вы вручную установили в исходной сессии, тогда этого метода может быть достаточно.