2011-10-10 3 views
8

私の環境では環境変数を使用していますが、環境変数が存在しない場合は、NAME_ENV_VARというエラーメッセージが表示されます。そのような変数はありません。 は例えば、ラインエラーを回避する方法:そのような環境変数はありませんか?

myeval $env($File) 

に私はエラーメッセージが表示されます。

can't read "env(NIKE_TECH_DIR)": no such variable 
    while executing 
"myeval $env($File)" 
    (procedure "chooseRelevantFiles" line 39) 
    invoked from within 
"chooseRelevantFiles $::GlobalVars::reqStage" 
(file "/vobs/tavor/src/Scripts/ReproduceBug.tcl" line 575) 

は、どのように私はこのエラーを回避し、私のスクリプトを実行するために行くことができますか?

答えて

6

catchエラー、あなたはそれで何かを(例えば値フォールバック後のためにそれを記録し、または使用)とスクリプト

例えばを進めることができます

if {[catch {myeval $env($File)} result]} { 
    lappend log $result 
} 
#other stuff 
15

あなたはinfo existsでテストした環境変数は、例えば、設定されていない場合、デフォルトを使用することができます。

if {[info exists env($File)]} { 
    set filename $env($File) 
} else { 
    set filename /some/default/path 
} 
myeval $filename 
+0

+1を一般的に言って、私はシステムの中で何かが原因で競合状態の存在するかどうかをチェック避けたいが、この場合には、それはおそらく適切 –

+1

である私は、 'upvarが好き0 :: env($ stuff)myvar;もし{{info is myvar}} {{'イディオムがやや良い。しかし、それはすべて個人的な好みに依存します。 – kostix

+0

@jk:エラーをキャッチするのは、避けるよりもはるかに遅いです.Tclのエラー処理は、目的に応じて超高速ではありませんが、:: :: envは、処理が遅い特殊なケースです(プロセス全体の状態Tclのコントロール外で変更することができます)。 –

3

[info exists $env(VAR)]を使用していない、グローバルのenv配列のような配列要素のかどうかを確認するには。代わりに 、あなたが使用する必要があります。

if { [ array names env VAR ] != "" } { 
    puts "\nVAR exists and its value is $env(VAR)\n" 
} 
+0

なぜですか?単純に 'info env(VAR)'にならないのはなぜですか?配列名のグロブマッチングはなぜですか? –

関連する問題