2

環境変数を読み取ることができます

$envVarVal = $ENV{'VAR_NAME'};

逆に設定しても機能しません。つまり、スクリプトの実行が完了すると変数は表示されません。

$ENV{'VAR_NAME'} = 'some_val';

システムコールも試しました:

`export VAR_NAME=some_val`;

呼び出しは Perl スクリプト内で成功しましたが、変数はスコープ外では見えませんでした。

それを行うことは可能ですか?そうでない場合、Perlでそれを行うことができないのはなぜですか?私が知る限り、通常のシェルスクリプト、任意のシェルを調達することによってですか?

4

3 に答える 3

13

はい、VMS を使用します。

これは最も実用的なアドバイスではないかもしれませんが、完全です。:)

VMS は...違います。VMS と Unix は、おそらく Windows と Unix よりも異なっています。Perl は Unix の考え方に基づいて構築されており、VMS のやり方にラップするために、これらの Unix の概念のいくつかを限界点まで拡張する必要があります。その一つが%ENV意味です。

VMS には、Unix のような環境変数はありません。VMS に最も近いものは論理名です。これらはキーと値のペアのテーブルであり、環境変数とシェル エイリアスの両方と同様の目的を果たします。Unix の環境変数とは異なり、Ogre と同様に、レイヤーがあります。

OpenVMS コンサルタントから: 論理名 (パート 1) :

ほとんどのプロセスは、少なくとも 4 つの論理名テーブル (プロセス、ジョブ、グループ、およびシステム) に関連付けられています。名前は通常、最初にプロセス、ジョブ、グループ、およびシステム テーブルを階層順に検索することによって変換されます。上級ユーザーは、検索および翻訳プロセスを制御できます。さらに、一部の翻訳では、セキュリティと整合性の理由から、エンド ユーザーによって定義された論理名が除外されます。

Unix では、環境テーブルはプロセスにコピーされるため、そのプロセスはその親に影響を与えることはできません。VMS では、論理テーブルはスタックです。VMS は、値が見つかるまでそのスタックを読み取ります。たとえば、たとえばSYS$OUTPUT(のようなSTDOUT) の値を要求すると、最初にプロセスの論理テーブルがチェックされ、次にジョブ、次にグループ、最後にシステム全体の値がチェックされます。このようにして、オペレーティング システムはSYS$OUTPUTシステム テーブルにデフォルトを定義できますが、それはユーザーまたは単一のプロセスによって上書きされる可能性があります。

これが複雑に思える場合、実際には実際に起こることを単純化したものです。

ロジカルはスタックなので、1 つ設定するとどうなるでしょうか?

最後に、この回答のポイント$ENV{FOO} = "BAR"まで、論理テーブル スタックを検索し、最初に見つかった FOO に割り当てます。プロセス テーブルに 1 つある場合は、それに割り当てられます。ジョブ テーブルに 1 つある場合は、それに割り当てられます。というように、書き込み許可の制限に達するまで続きます。その時点で、最上位のテーブル (おそらくジョブ テーブル) に新しいエントリが作成されます。つまり$ENV{FOO} = "BAR"、ジョブ テーブルに配置される可能性が非常に高いため、すべてのプロセスで表示されます。

これが、あるプロセスで Perl の環境変数を設定し、別のプロセスにエクスポートする方法です。

于 2012-11-30T22:50:01.063 に答える
8

これは、perl だけでなくシェルでも、ほとんどのシステムでは不可能です。各プロセスは、親から継承された環境の独自のコピーを取得し、環境への変更は、そのプロセスとそれが作成する子プロセスにのみ影響します (環境に変更を加えた後)。

perl で設定された環境変数は、$ENV{VAR_NAME} = 'some_val';その後 perl スクリプトによって作成されたプロセスで使用できるようになります。シェルスクリプトによって設定された環境変数がexport VAR_NAME=some_val、そのスクリプトによって後で作成されるプロセスに反映されるのと同じように。

シェル関数またはシェル スクリプトのソース (source scriptnameまたはを使用. scriptname) は、関数またはソース スクリプトよりも有効な環境に変更を加えることができます。しかし、それが可能なのは、そのコードを実行するための新しいプロセスが作成されないためです。それは、それが呼び出されたのと同じプロセス内で実行されます。

perl のバックティック演算子を使用して実行しexportても意味がありません。これは、環境変数が設定されている新しいシェル プロセスを perl が開始するため、成功しますが、そのプロセスは有用なことを何もせずにすぐに終了します。

を使用echo $$してプロセス ID を表示することで、これを実際に確認することができます。ソースのシェル スクリプト内でスクリプトを実行する前に、ソースを使用せずに同じスクリプトを実行する前に、および perl のバックティック演算子で実行されるシェル コード内から実行する前に、それを試してください。プロセス ID は、 を使用して perl から出力することもできますprint $$, "\n";

于 2012-11-30T22:05:33.833 に答える
6

それは不可能。ただし、Perl にスクリプトを作成してから、それをソースまたは評価するように指示できます。

#!/bin/bash
eval $(perl -e 'print "VAR1=", rand 1')
perl -e 'print "VAR2=", rand 1' > var2.sh
. var2.sh
rm var2.sh
echo $VAR1 $VAR2
于 2012-11-30T22:30:29.567 に答える