1

Есть ли способ сделать копию текущей оболочки со всеми переменными среды, установленными в этой конкретной оболочке?

Рассмотрим оболочку, в которой я инициализировал переменные var1 , var2 и var3 . В идеале значения переменных не будут известны новой оболочке, например оболочке в отдельной (новой) вкладке в моем эмуляторе терминала. Я хотел бы сделать копию текущей оболочки относительно переменных, установленных там. Это возможно?

1 ответ1

4

Если речь идет только о переменных в Bash (вопрос помечен как ), этот вопрос Ask Ubuntu является хорошей отправной точкой:

Вы можете видеть все переменные с помощью встроенного declare .

declare -p

Если вас интересуют только переменные окружения, используйте

declare -xp

Запустите help declare чтобы увидеть другие варианты.

Выходные данные имеют правильный синтаксис для получения, поэтому возникает следующее решение:

  1. В исходной сессии Bash запустите

    declare -p > ~/some_file
    
  2. В целевой сессии 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
    

Таким образом, в целом целевой сеанс не станет точной копией. Тем не менее, если все, что вам нужно, это передать переменные, которые вы вручную установили в исходной сессии, тогда этого метода может быть достаточно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .