要跨多个 korn (ksh93) shell 脚本(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 函数来读取文件并返回/设置标志值。这些标志由我设置,以简化对脚本功能的控制。

有没有更好的处理方法?这有点落在吸气器设计模式中......

如果您使用的是 ksh93,而不是 ksh88,则更优雅的方法是使用学科函数来实现这一点。

它们允许为 shell 变量实现 getter et setters 函数。然后,您可以创建一个 getter,它将从共享存储区域(文件、ldap 目录、数据库等)中选取变量值,并创建一个将更新相同后端的 setter。

下面是一个快速示例:

又名

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

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

最新更新