экспорт (сохранение) и импорт (исходные) переменные оболочки

экспорт (сохранение) и импорт (исходные) переменные оболочки

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

Я попробовал это, но это не работает, если есть переменные, содержащие пробелы.

$ env > my_environment
$ . my_environment

Думаю, правильный способ — это как-то повозиться с /proc/$$/environэтим и проанализировать его barscript, но я не могу найти правильный способ сделать это.

edit: Кавычки или переносы строк тоже проблематичны. Как можно сделать так, чтобы envars, такие проблемные, как следующие, могли быть получены без проблем?

PROBLEMATIC='this has double quotes " and single quotes '\'' and even
newlines.

See?'

решение1

$ declare -p > my_environment

Позже, внутри barscript:

. my_environment

declare -pвыводит переменные среды в форме, которую может выполнить оболочка, включая кавычки и экранирование переменных по мере необходимости.

$ foobar='"some double-quoted text"'
$ echo $foobar 
"some double-quoted text"
$ declare -p foobar
declare -- foobar="\"some double-quoted text\""

Кстати, если вы не хотите выводить всю среду, то и не нужно. Просто назовите переменные, которые вы хотите вывести, в declare -pкомандной строке:

$ declare -p HOME PATH foobar
declare -x HOME="/home/cas"
declare -x PATH="/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11"
declare -- foobar="\"double-quoted-text\""

или выполнить конвейерную передачу, grep -vчтобы исключить определенные переменные, которые вам не нужны в выводе.

Чтобы получить только экспортированные переменные:

declare -p -x > my_environment

Более подробную информацию см . help declareв bash.

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