2017-02-16 36 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