2016-06-02 31 views
1

私は.cshrcファイルをソースとTclスクリプトを実行すると、それが正常に動作している:tclで環境変数を設定する方法は?

setenv AUTOTEST "/auto/isbutest/frt" 
setenv ATS_EASY "$AUTOTEST" 
setenv ATS_USER_PATH "$AUTOTEST" 
setenv PATH "${AUTOTEST}/bin:${PATH}" 

しかし、私はTclの自体に環境変数を設定してみました:

$ source .cshrc-sample 
$ tclsh invoke.tcl 

は次のように.cshrcファイルですスクリプトを実行します。 次のエラーが表示されます。

$ tclsh invoke.tcl 
can't find package ha 
    while executing 
"package require ha" 
    (file "invoke.tcl" line 8)  

M Y Tclスクリプト - invoke.tcl

global env 

set env(AUTOTEST) "/auto/isbutest/frt" 
set env(ATS_EASY) "/auto/isbutest/frt" 
set env(ATS_USER_PATH) "/auto/isbutest/frt" 
set env(PATH) "$env(PATH):/auto/isbutest/frt/bin:"; 
package require ha 

どのように私は.cshrcを調達せずにスクリプトを実行することができますか?

スクリプトを使用して環境変数を設定することはできません。変数の有効期間はスクリプトの実行時間内です。変数PATHを印刷しようとすると、必要なものが表示されますが、なぜ動作しないのか分かりません。これには他の回避策がありますか?

答えて

0

いくつかの可能性があります。あなたが見逃していたその他の環境変数があるかどうか、Tcl auto_pathグローバル変数がpackage requireの直前で正しいかどうか、そして何か他のことが起こっているかどうかが重要です。

puts "auto_path=$auto_path" 
parray env 

をすぐにエラーが発生しましたpackage require前:

のTcl側からの最も簡単な方法は、追加することです。それはたくさんの情報を出力するはずです。 (あなたが異なっTCL_LIBRARYまたはTCLLIBPATH環境変数を設定している場合には、特に注意してください。)

それはさておき、それは対話モードでのみsource D(これで~/.tclshrcファイルに設定され、何かがあることが可能ですプロンプトが出る前に起こります)。それは観察可能な変化を引き起こす可能性があります。別のオプションは、haパッケージのpkgIndex.tclスクリプトが、Tclが対話モードのときにのみ機能する簡略化されたコマンドを使用するように書かれている場合です。パッケージインデックス定義スクリプトでエラーが発生すると、パッケージの実装が登録されていないため、実際にどのようにload/sourceに登録されていないかを示すコードが作成され、表示されるエラー状態が発生する可能性があります。スクリプトで略語を使用できると仮定している場合、はそれを修正します。これは常にバグです。略語は対話的にTclを使うときの便利なものであり、決して適切な保存されたコードに入れてはいけません。

パッケージの一覧が完全かどうかを確認したい場合があります。グローバル変数のいずれかに設定した後、問題package require前にこれを入れ、再び

catch {package require NoSuchPackage}; # Force immediate population of the list of packages 
puts Packages:\n\t[join [lsort -dictionary [package names]] \n\t] 

:そのためにこのコードを使用します。

関連する問題