2013-03-05 75 views
4

我有一些shell代碼我需要調試,所以我的代碼拋售其環境到一個文件採購ENV輸出

env > env.txt 

,並與我的測試腳本,我想它來源,test.sh:

. ./env.txt 
echo $EXAMPLE 
echo $EXAMPLE2 

env.txt的內容是:

EXAMPLE=sh /hello/command.sh 
EXAMPLE2=/just/some/path 

但是,包膜不把圍繞其價值,這往往會導致報價是起訴$例如,我得到這個錯誤

test.sh:/hello/command.sh:找不到

那麼清楚它正試圖去運行它設置變量。

你覺得這個問題最快的解決方法是什麼?

+1

嗯,'set> env.txt'設置了所有的全部內容,但是這對當前的env.txt沒有任何幫助...... – Wrikken 2013-03-05 23:05:25

+0

請注意'env> env.txt'只會記錄* environment *變量,但'。 。/ env.txt'會設置Bash變量*而不導出它們。你確定這是你想要的嗎? – ruakh 2013-03-05 23:10:17

+2

在某些shell中,'set> env.txt'會將標準輸出從該點重定向到'env.txt'。爲便於攜帶,使用'(set)> env.txt'更安全。 – Idelic 2013-03-06 00:05:59

回答

4
while read line; do 
    declare "$line" 
    # declare -x "$line" 
    # export "$line" 
done < env.txt 

如果你想要將其值導出到環境中,使用-x選項declare或使用export命令。

+0

這對我來說最合適。謝謝。 – paxamus 2013-03-06 19:03:40

1

輸出重定向到一個文件之前添加的雙引號:

env | sed 's/=\(.*\)/="\1"/' > env.txt 
+1

+1,因爲OP要求「最快的解決方法」,但這不是一個非常可靠的解決方案。例如,如果任何變量值包含換行符或反斜線或美元符號,它將中斷。 – ruakh 2013-03-05 23:05:31

+0

我喜歡這樣的sed技巧,謝謝。 – paxamus 2013-03-06 19:02:50

1
while read line; do 
var="${line%=*}" 
value="${line##*=}" 
eval "$var=\"$value\"" 
done <env.txt 
+0

不需要'eval'。如果你想導出參數,只需使用'declare'$ line「',或'export'$ line」'。 – chepner 2013-03-06 13:27:14