Если речь идет только о переменных в 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
Таким образом, в целом целевой сеанс не станет точной копией. Тем не менее, если все, что вам нужно, это передать переменные, которые вы вручную установили в исходной сессии, тогда этого метода может быть достаточно.