2013-03-05 51 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