TL, DR: экспорт с
export -p >env_var.sh
и импорт с
. env_var.sh
Работает ли ваш код, зависит от формата env_var.txt
и какие специальные символы (т.е. символы, которые имеют особое значение в синтаксисе оболочки) присутствуют в именах и значениях переменных.
`cat env_var.txt`
- это подстановка команды без кавычек. Если оставить подстановку команды переменной без кавычек, к ней применяется оператор «split + glob»: сначала разделите вывод команды на символы в значении переменной IFS
, затем интерпретируйте каждую часть как подстановочный знак имени файла. pattern и замените каждый шаблон, который соответствует некоторым файлам, на имена соответствующих файлов. Результатом является список слов, по которым повторяется цикл for
.
Подстановка команд без кавычек редко бывает тем, что вам нужно, и в данном случае это определенно не то, что вам нужно. Однако это работает, если синтаксис файла, например, вывод env
и значения переменных не содержат *? \ [
или пробелов .
Если env_var.txt
- это результат env
, вы можете получить лучшие результаты, если проанализируете его в соответствии с его фактическим синтаксисом (присвоения, разделенные новой строкой), вместо того, чтобы использовать метод синтаксического анализа, который не имеет смысла. Если вы хотите использовать оператор split + glob, что является самым простым способом сделать это, установите IFS
только на новую строку и включите сопоставление с подстановочными знаками.
set -f; IFS='
'
export `cat env_var.txt`
set +f; unset IFS
Однако существует проблема, которую вы не можете решить на стороне получателя: результат env
неоднозначен. Учитывая следующее содержание:
foo=bar
hello=world
невозможно определить, есть ли две переменные (одна называется foo
со значением bar
, а другая называется hello
с значение world
) или только тот, который называется foo
со значением
bar
hello=world
Чтобы экспортировать переменные среды однозначным образом, не используйте env
, используйте экспорт
вместо . Команда export -p
выводит список значений всех переменных среды, которые могут быть проанализированы оболочкой. Итак, на стороне экспорта запустите
export -p >env_var.sh
На стороне импорта запустите
. env_var.sh
Предостережение: в bash вывод export -p
можно анализировать, но только с помощью bash. Чтобы получить результат, работающий в других оболочках в стиле sh, установите для POSIXLY_CORRECT
любое значение.Это не оказывает вредного воздействия на другие оболочки, поэтому вы можете просто выполнить
(POSIXLY_CORRECT=$POSIXLY_CORRECT; export -p) >env_var.sh
Установка для POSIXLY_CORRECT
значения, которое у него было раньше, не влияет на вывод - либо его не было в среде и его не будет после запуска этого, или он был в среде, и его значение не изменилось. Но этого достаточно, чтобы заставить bash использовать переносимый синтаксис с export
в выводе export -p
, а не специфичный для bash синтаксис с declare
.
Обратите внимание, что импорт переменных среды может привести к выполнению произвольного кода, поэтому убедитесь, что вы импортируете только env_var.txt
или env_var.sh
из источника, которому вы доверяете. Виной всему переменные окружения, а не . env_var.sh
выполняет код: простой импорт таких переменных, как PATH
, LD_PRELOAD
, ENV
и т. д., может привести к выполнению кода в дальнейшем. .
Для запуска приложения не нужно связывать jar-файл. Бинарный файл, который вы хотите запустить, - это java с файлом jar в качестве аргумента. Для этого вам нужно создать файл инициализации (или файл модуля sysyemd вашей системы, использующий systemd ). Сценарий должен обрабатывать как минимум аргумент start и stop для запуска и остановки вашего приложения. Затем в начале будет установлен ваш дом java и другие элементы, необходимые вашему приложению, а затем запущена команда java. Существует ряд доступных шаблонов для сценариев инициализации, которые вы можете использовать.