跨多个korn(ksh93)shell脚本使用的环境变量(getter-setter)

时间:2012-12-05 15:13:13

标签: unix environment-variables solaris ksh getter-setter

我有一组共享一些用作状态标志的环境变量的脚本。

考虑:

./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.

  • setEnvVariables.sh包含我想在同一个shell中执行的其他脚本中使用的变量。
  • 其中一些变量充当标志,可以在script1.sh,script2.sh,..脚本执行过程中手动更改文件。

另一种方法是将标志保存在文件中,并创建典型的get / set函数来读取文件并返回/设置标志值。这些标志由我设置,以简化脚本功能的控制。

有没有更好的方法来处理这个?这种情况属于吸气剂设定模式......

1 个答案:

答案 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