* export * все переменные из файла key = value в shell
Если я хочу наследовать переменные среды дочерним процессам, я делаю что-то вроде:
export MYVAR=tork
Предположим, у меня есть файл site.conf
, содержащий назначения значений (которые могут содержать пробелы) для переменных:
EMAIL="[email protected]"
FULLNAME="Master Yedi"
FOO=bar
Теперь я хотел бы обрабатывать этот файл всякий раз, когда я открываю новую оболочку (например, с некоторым кодом в ~/.bashrc
или ~/.profile
), так что любые процессы, запущенные из этой недавно открытой оболочки, наследуют назначения через переменные среды.
Очевидным решением будет префикс каждой строки в site.conf
с помощью export
и просто исходный файл. Однако я не могу этого сделать, поскольку файл также читается (напрямую) некоторыми другими приложениями, поэтому формат исправлен.
Я пробовал что-то вроде
cat site.conf | while read assignment
do
export "${assignment}"
done
Но это не работает по разным причинам (самое главное, что export
выполняется в подоболочке, поэтому переменная никогда не будет экспортироваться в дочерние оболочки вызывающей оболочки).
Есть ли способ программно export
неизвестных переменных в bash?
Ответы
Ответ 1
Запустите set -a
перед поиском файла. Это отмечает все новые и измененные переменные, которые следуют за экспортом автоматически.
set -a
source site.conf
set +a # Require export again, if desired.
Проблема, которую вы наблюдаете, заключается в том, что труба выполняет export
в подоболочке. Вы можете избежать этого просто с помощью перенаправления ввода вместо канала.
while read assignment; do
export "$assignment"
done < site.conf
Однако это не сработает, если (хотя это маловероятно), у вас есть несколько назначений на одной строке, например
EMAIL="[email protected]" FULLNAME="Master Yedi"
Ответ 2
Проблема заключается в cat site.conf | while read assignment
использовании труб.
Трубы создают суб-оболочку, поэтому переменная, созданная с помощью export
, создается в под-оболочке и недоступна в вашей текущей оболочке.
Вы можете просто сделать:
source $HOME/site.conf
из вашего ~/.bashrc
, чтобы экспортировать все переменные и сделать их доступными в оболочке.