我有一组共享一些用作状态标志的环境变量的脚本。
考虑:
./script1.sh; ./script2.sh; # I execute 2 scripts within the same shell.
现在,每个脚本都会定期执行以下脚本,以设置(刷新)环境变量:
. ./setEnvVariables.sh #This executes it in the context of the current shell
and thus making the environment variables accessible across both scripts.
script1.sh,script2.sh,..
脚本执行过程中手动更改文件。另一种方法是将标志保存在文件中,并创建典型的get / set函数来读取文件并返回/设置标志值。这些标志由我设置,以简化脚本功能的控制。
有没有更好的方法来处理这个?这种情况属于吸气剂设定模式......
答案 0 :(得分:4)
如果您使用的是ksh93,而不是ksh88,那么更优雅的方法是使用纪律函数来实现它。
它们允许为shell变量实现getter和setter函数。然后,您可以创建一个getter,它将从共享存储区域(文件,ldap目录,数据库等)和将更新相同后端的setter中选择变量值。
这是一个简单的例子:
a.ksh
function shared.get
{
.sh.value=$(</tmp/shared)
}
function shared.set
{
echo ${.sh.value}>/tmp/shared.new
mv /tmp/shared.new /tmp/shared
}
set -x
echo $shared
shared=22
echo $shared
./b.ksh
echo $shared
b.ksh
function shared.get
{
.sh.value=$(</tmp/shared)
}
function shared.set
{
echo ${.sh.value}>/tmp/shared.new
mv /tmp/shared.new /tmp/shared
}
set -x
echo $shared
shared=11
echo $shared
以子shell运行的b.ksh修改父进程(a.ksh)中共享变量的值。
$ ./a.ksh
+ echo 11
11
+ shared=22
+ echo 22
22
+ ./b.ksh
+ echo 22
22
+ shared=11
+ echo 11
11
+ echo 11
11