我希望我的脚本读取包含要设置的环境变量的键/值对的文件,然后进行设置。
到目前为止,我有这个:
#!/bin/bash
cat $1 | while read kv
do
key=${kv%=*}
val=`echo ${kv#*=} | sed 's/^"\|"$//g'`
export $key="$val"
done
我想读取一个这样的文件:
XAUTHLOCALHOSTNAME="localhost"
DISPLAY=":0"
XAUTHORITY="/tmp/some-XAuthority"
我只需要在脚本的作用域内在这些作用域中使用这些变量,因此不需要解决在脚本中为父作用域设置一个变量的问题。
通过测试,我认为我的问题出在export $key="$val"
哪里,所以我只需要替换该行即可。
export $key=$val
应该在中工作得很好bash
。我怀疑您的问题是管道(|
)。管道中的所有命令都在子Shell中执行。在您的示例中bash
,正在运行脚本的实例将派生两个子shell:一个用于cat $1
,另一个用于while read ...
。在运行while循环的子外壳中分配和导出变量,然后在子外壳退出时立即将所有变量丢弃。解决此问题的一种方法是根本不产生子外壳。代替无用的cat,请尝试重定向:
while read ...; do
...
done < "$1"
BashFAQ 24更详细地解释了这一点。
另一种方法是仅导出文件,并导出:
. <(sed '/^export/!s/^/export /' "$1")
的<( )
是进程替换。
另外要注意的是,由于您正在从参数读取环境变量,因此必须确保参数文件$1
是受信任的源,因此它不会对脚本造成不良影响。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句