2

ステータスフラグとして使用されるいくつかの環境変数を共有する一連のスクリプトがあります。

検討:

./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には、同じシェル内で実行される他のスクリプトで使用する変数が含まれています。
  • これらの変数の一部は、script1.sh,script2.sh,..スクリプトの実行中にファイル内で手動で変更される可能性のあるフラグとして機能します。

別のアプローチは、フラグをファイルに保存し、ファイルを読み取ってフラグ値を返す/設定するための一般的なget/set関数を作成することです。これらのフラグは、スクリプト機能の制御を簡素化するために私が設定したものです。

これを処理するより良い方法はありますか?これは、ゲッターセッターのデザインパターンに該当します...

4

1 に答える 1

5

ksh88ではなくksh93を使用している場合、より洗練された方法は、規律関数を使用してこれを実装することです。

それらは、シェル変数のgetteretsetter関数を実装することを可能にします。次に、共有ストレージ領域(ファイル、LDAPディレクトリ、データベースなど)から変数値を選択するゲッターと、同じバックエンドを更新するセッターを作成できます。

簡単な例を次に示します。

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

サブシェルとして実行されている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
于 2012-12-05T15:43:34.863 に答える