![экспорт (сохранение) и импорт (исходные) переменные оболочки](https://rvso.com/image/88759/%D1%8D%D0%BA%D1%81%D0%BF%D0%BE%D1%80%D1%82%20(%D1%81%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5)%20%D0%B8%20%D0%B8%D0%BC%D0%BF%D0%BE%D1%80%D1%82%20(%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D0%B5)%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%20%D0%BE%D0%B1%D0%BE%D0%BB%D0%BE%D1%87%D0%BA%D0%B8.png)
Мне нужно сохранить переменные окружения в файл, и (позже) процесс должен импортировать их. Мне нужно это, чтобы обойти программу, 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
.