2017-02-16 68 views
1

环境: 旧版本的systemd正在容器中运行。默认情况下,systemd启动的服务不会获取容器的环境变量,因为systemd将其删除以启动新的进程。较新的版本允许通过systemd指令传递变量,但在这里使用更新的版本是不可行的。convert/proc/1/environ变量脚本

我不得不使用一些通过环境变量的脚本,最初这很简单,我想,这个小脚本已经做90%的工作

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

但现在我确实有环境变量,包含“\ n”,导致类似的东西

VAR=totally 
screwed 
up 

甚至包含=或其他特殊字符UTF8等

是否有任何聪明为什么正确地将这些内容输入到只将值赋给变量的脚本中?

最后它可能会导致类似这样的事情。

VAR="totally\nscrewed\up" 

回答

1

我的/ proc/1/ENVIRON文件有没有任何奇怪的字符内,所以我复制这个文件,我打破了一些条目来接近你的情况。

这应该工作正常将文件分割基于空分离器阵列上:

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

通过使用-p声明我们可以检查数组中存在的数据。

只是为了记录在案,也readarray方法(无需使用while循环),似乎确定工作:

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

似乎不适合我(TM)工作。它仍然在变量阵列中创建“螺旋”“向上”作为单独的行([0] = VARS =完全“[1] =”拧紧“[2] =”向上“) – Mandragor

+0

@Mandragor好的,没有工作。尝试这个技巧 - 这应该是:'readarray -t vars2 <(cat file4 | tr -d'\ n'| tr'\ 0''\ n')'实际上,我们从初始文件中删除任何新行,那么我们将空字节转换为新行,我们不能像这样错过它 –

+0

嗯,我后面需要'\ n',所以基本上它必须像上面说的那样保持它像VAR =“totally \ nscrewed \ nup “帮助解决问题,所以如果字符串中包含”还需要被转义...等 – Mandragor