メニューボタン
サポートチーム便り2010.07.21

CLでの環境変数の取得

Question

自分の CL プログラムで、QShell が使用する PATH 環境変数に、いくつかのフォルダーを追加させたいと考えています。PATH 値全体を置き換えたいのではなく、ユーザーがその PATH値 で持っているものに、いくつかのディレクトリーを追加したいだけです。私の考えでは、Retrieve Environment Variable (RTVENVVAR) コマンドを呼び出して(現在の)環境変数を取得し、自分のディレクトリーを最後に追加することでしたが、RTVENVVAR コマンドが存在しないようです。どうしたらいいでしょうか。また、これは可能なのでしょうか。

Answer

そのとおりですね。IBM が Add Environment Variable (ADDENVVAR) コマンドだけでなく Change Environment Variable (CHGENVVAR) コマンドを提供していましたが、CL プログラムの環境変数の値を取得する方法を提供していなかった点は、常々つくづくおかしいと思っていました。

あなたのジレンマには 2 つの解決方法があります。最初の解決方法は QShell 自体を使用して PATH 環境変数を更新する方法です。2 番目の方法は、getenv() API を使用して自分の RTVENVVAR コマンドを構築する方法です。両方をデモンストレーションします。

QShell でのみ使用される環境変数を操作する必要がある場合、QShell にその作業をさせてはどうでしょうか。QShell 環境により、環境変数の扱いが簡単になります。環境変数の値を QShell コマンド・ラインの任意の場所に挿入するには、環境変数の前にドル記号 ($) を配置するだけです。例えば、次のようになります。

QSH CMD('PATH=$PATH:/usr/local/bin; dosomething')

この例では、$PATH により QShell は PATH 環境変数の現在の内容を取得し、コマンド・ラインに挿入します。したがって現在 PATH に /usr/bin ディレクトリーが入っている場合、QShell は (暗黙的に) コマンド・ラインを次のように変更します。

QSH CMD('PATH=/usr/bin:/usr/local/bin; dosomething')

つまり、はじめに PATH 環境変数の内容が引用され、その後ろに :/usr/local/bin を追加します。セミコロンを使用して同じコマンド・ラインで複数の QShell コマンドを実行できます。PATH が更新された後、新しい PATH 変数が有効な状態で (仮説的に) 何かをするコマンドが実行されます。

しかし、QShell が自分の環境変数を持っている点は注目に値します。ILE 環境からそれらの環境変数のコピーを作成し、QShell のコピーを変更できます。しかし QShell で環境変数を変更しても ILE のコピーには影響がありません。したがって、この手法で QShell で使用される変数を更新する場合、変更内容が失われないよう、QShell を起動するたびに再度変数を更新する必要があります。さらに、環境変数を使用する ILE アプリケーションは QShell コピーを確かめることはありません。

その結果、この手法は QShell 環境で使用する変数を変更する場合のみ、本当に役立ちます。PASE を開始するときに /qopensys/usr/bin/sh などのシェルを起動しさえすれば、PASE 環境でも同じことができます。

多くの場合、標準 IBM i 環境変数を CL プログラムに取り込み、そこで操作を行うことができるのは道理に合っており、この手法には QShell 手法が持っている欠点は何もありませんが、唯一の問題点は、IBM が CL から環境変数を取得するコマンドを提供していないことです。IBM は getenv()という API を提供していますが、CL プログラムから直接使用するのはちょっと面倒なので、これらの環境変数を取得するために RTVENVVAR という新しい CL コマンドを作成しました。このツールは通常の CL コマンドとして実装されているため、CL プログラムから使用できます。

この RTVENVVAR コマンドをダウンロードし、インストールしたら、次のように CL プログラムで使用できます。

PGM

    DCL VAR(&PATH) TYPE(*CHAR) LEN(1000)

    RTVENVVAR ENVVAR(PATH) VALUE(&PATH)
    CHGVAR VAR(&PATH) VALUE(&PATH *TCAT ':/usr/local/bin')
    CHGENVVAR ENVVAR(PATH) VALUE(&PATH)

    QSH CMD('dosomething')

ENDPGM

RTVENVVAR コマンドはどの環境変数も取得できなければなりません。VALUE パラメーターのサイズは、 1 から 32765 バイトの間なら、自由にサイズを設定できます。

環境変数を扱う場合は、通常 (RTVENVVAR コマンドまたは QShell 手法のいずれかで)大文字と小文字を区別することを忘れないでください。「path」という変数は「PATH」という変数とは異なります。

ここをクリックして RTVENVVAR コマンド(ZIP形式)をダウンロードできます。
あなたのPC上で解凍し、README.txt ファイルを参照して、IBM i システムに導入してください。

あわせて読みたい記事

PAGE TOP