pal*_*wim 9 bash shell-script environment-variables
我希望我的脚本读取包含要设置的环境变量的键/值对的文件,然后设置它们。
到目前为止,我有这个:
#!/bin/bash
cat $1 | while read kv
do
key=${kv%=*}
val=`echo ${kv#*=} | sed 's/^"\|"$//g'`
export $key="$val"
done
Run Code Online (Sandbox Code Playgroud)
我想读取这样的文件:
XAUTHLOCALHOSTNAME="localhost"
DISPLAY=":0"
XAUTHORITY="/tmp/some-XAuthority"
Run Code Online (Sandbox Code Playgroud)
我只需要在脚本的持续时间内作用域中的这些变量,所以我不需要解决在脚本中为父作用域设置变量的问题。
从我的测试来看,我认为我的问题在于export $key="$val"
,所以我认为我只需要替换该行。
jw0*_*013 10
export $key=$val
应该可以正常工作bash
。我怀疑您的问题是管道 ( |
)。管道中的所有命令都在子 shell 中执行。在你的榜样,实例bash
运行脚本将叉掉2子shell:一个是cat $1
,另一个用于while read ...
。在运行while循环的子shell中分配和导出变量,然后在子shell退出时立即将它们全部抛出。解决此问题的一种方法是根本不生成子外壳。与其无用地使用 cat,不如尝试重定向:
while read ...; do
...
done < "$1"
Run Code Online (Sandbox Code Playgroud)
BashFAQ 24更详细地解释了这一点。
另一种方法是仅获取文件,并导入导出:
. <(sed '/^export/!s/^/export /' "$1")
Run Code Online (Sandbox Code Playgroud)
这<( )
就是过程替换。
作为额外的注意事项,由于您正在从参数中读取环境变量,您必须确保参数文件$1
是可信来源,这样它就不会对您的脚本造成不良影响。
归档时间: |
|
查看次数: |
11702 次 |
最近记录: |