* 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, чтобы экспортировать все переменные и сделать их доступными в оболочке.