用于设置环境变量的Shell脚本
问题描述:
我正在编写一个shell脚本来设置其值在文件中可用的环境变量。下面是shell脚本我写的,用于设置环境变量的Shell脚本
VARIABLE_FILE=env-var.dat
if [ -f ${VARIABLE_FILE} ] ; then
. ${VARIABLE_FILE}
if [ ! -z "${TEST_VAR1}" ] ; then
export TEST_VAR1="${TEST_VAR1}"
fi
if [ ! -z "${TEST_VAR2}" ] ; then
export TEST_VAR2="${TEST_VAR2}"
fi
fi
上面的代码只能工作在bash shell的,因为我已经使用export命令来设置环境变量,如果我有任何其他的shell使用它,它失败。是否有任何命令设置在任何shell中工作的环境变量?
答
“票友”像bash和zsh中证炮弹,您可以设置一个变量,并在同一时间导出为环境变量,像这样:
export FOO=bar
使用标准POSIX的Bourne shell,相当于实现在两个命令这样做:
FOO=bar
export FOO
注意,一旦你导出的变量,可以将其恢复到一个不同的值,以后在脚本中,它仍然出口(你不需要再次导出)。此外,您可以一次导出几个变量:
FOO=bar
BAZ=quux
export FOO BAZ
您在您的评论中提到的tcsh,但CSH和衍生物是基于伯恩壳完全不同的(不建议使用!)。你很少能同时与sh和csh兼容的shell脚本。对于csh,请查看setenv
答
如果您确实希望发生这种情况,可以这样做,但这很棘手。一种方法是使用awk输出正确的语法并评估从awk返回的文本。要在主要的sh和csh风格之间共享一个单独的环境变量值文件,文件中的以下命令会将一个变量值文件导入到环境中:(是的,是的,这是一条巨大的线,因为某些shell处理不灵活的方式。反引号如果你不介意有.awk文件太多,你可以用awk -f ...)
eval `awk '{ var = $1; $1=""; val=substr($0,2); if (ENVIRON["SHELL"] ~ /csh$/) { print "setenv", var, " \"" val "\";" } else { print var "=\"" val "\"" ; print "export", var }}' $HOME/env_value_file`
变量值文件的格式如下:
FOO value for foo
BAR foo bar
BAZ $BAR plus values $FOO
设计教育笔记:
- 在awk中,访问字段2-NF没有简单的方法,因此如果 可能是变量值中的空格,我们需要修改$ 1以获得 $ 0以获得我们想要的值。
- 为了达到此目的,由于总是设置SHELL变量,但不是作为 环境变量而不是作为一致的大小写,所以您必须从shell的值中将SHELL环境变量弄湿 ,如下所示。在使用该脚本之前,将其作为环境变量使用 。
- 另外,如果您希望在导入 环境脚本后出现新的环境值,则需要获取环境脚本的源代码。
- 如果一个shell不能很好地进行评估,你必须调整脚本。
对于Bourne壳香精(bash中,SH,KSH,zsh中):
export SHELL
. import_environment
对于csh口味:(shell变量趋向于在csh壳小写)
setenv SHELL "$shell"
source import_environment
对于“任何”的值是什么? – choroba 2013-03-18 09:29:10
bash,tcsh,ksh,... – Mojoy 2013-03-18 09:37:26