2017-02-16 3 views
1

Окружающая среда: Старая версия systemd работает в контейнере. По умолчанию службы systemd не получают переменные среды в контейнере, потому что systemd удаляет их для новых запущенных процессов. Более новые версии позволяют передавать переменные через директивы systemd, но здесь нецелесообразно использовать более новую версию.convert/proc/1/environ to variables script

я должен использовать некоторые из переданных переменных среды для сценария, и первоначально это было легко, я думал, это небольшой скрипт, уже делает 90% работы

$ cat /proc/1/environ |tr '\0' '\n' 
HOME=/ 
TERM=linux 

Но теперь у меня есть переменные окружения, содержат «\ п», что приведет к чему-то вроде того, что

VAR=totally 
screwed 
up 

или даже содержат = или другие специальные utf8 символов и т.д.

есть ли умный, почему в правильно ли получить этот контент для скрипта, который просто присваивает значения переменным?

В конце концов, вероятно, это приведет к чему-то подобному.

VAR="totally\nscrewed\up" 

ответ

1

Мой файл/Proc/1/окружать не имеет никаких странных символов внутри, так что я скопировал этот файл и я сломал несколько записей, чтобы приблизиться к вашей ситуации.

Это один должен работать нормально, чтобы разбить файл на массив на основе нулевого сепаратора:

$ while IFS= read -r -d '' line ; do vars+=("$line");done <file;declare -p vars 

Используя объявляю -p мы можем проверить данные в массиве.

Просто для записи, также readarray метод (без необходимости использовать время цикла), кажется, работает нормально:

IFS= readarray -t -d '' vars <file 
+0

, похоже, не работает для меня (TM). он по-прежнему создает «вкрутую» «вверх» в виде отдельных строк в массиве vars ([0] = VARS = полностью »[1] =« завинчивается »[2] =« вверх ») – Mandragor

+0

@Mandragor OK, да не работает. Попробуйте этот трюк - это должно работать: 'readarray -t vars2 <<(cat file4 | tr -d '\ n' | tr '\ 0' '\ n')'. Фактически мы удаляем любую новую строку из исходного файла и то мы преобразуем нулевые байты в новые строки. Мы не можем пропустить это так: –

+0

hmm, мне нужно «\ n» позже, поэтому в основном он должен содержать это, как сказано выше, что-то вроде VAR = «полностью \ nscrewed \ nup «помогает для проблемы \ n, поэтому, если строка содержит« также должна быть экранирована ... и т. д. – Mandragor