2016-12-28 19 views
0

私はCシェルとTCLの2つの別々のスクリプトで使用されている変数を持っています。それを一度定義して両方のスクリプトにアクセスする方法はありますか?CシェルとTCLの間の変数の共有

vars.sh

#!/usr/bin/env tcsh 
set a=b 

run.sh

#!/usr/bin/env tcsh 
source vars.sh 
echo $a 

vars.tcl

#!/usr/bin/env tclsh 
set a b 

run.tcl

#!/usr/bin/env tclsh 
source vars.tcl 
puts $a 

同じ変数を2つの異なるフォーマットで格納するために2つの別々のファイルを生成するという考えは嫌いです。単一のvarsファイルを使用し、変数をCシェルとTCLの両方で使用できる方法はありますか?

答えて

1

最も簡単な方法は、変数を環境変数にすることです。それらの変数は、親プロセスの子プロセスによって継承されるためです。 (Tclの側では、彼らは::envグローバル配列内の要素だし、Cシェル側に、彼らは他の変数のように読めるが、setenvを使って設定する必要がありますすることができます。)

は、単一の構成ファイルを共有しています2つの言語が異なる構文を使用するため、はるかに難しくなります。クォートの仕方が複雑でない限り、TclはCシェル形式を解析することができます。

proc loadVariablesFromCshellFile {filename arrayName} { 
    upvar 1 $arrayName array 
    set f [open $filename] 
    while {[gets $f line] >= 0} { 
     if {[regexp {^\s*set (\w+)=([""'']?)(.*)\2\s*$} $line -> key quote value]} { 
      set array($key) $value 
     } 
    } 
    close $f 
} 

これは値内の変数の置換を処理しないため、完全なコードではありませんが、開始するだけで十分です。 (私はまた、あなたがその機能を使用していない願っています。あなたがある場合は、移植性を達成するのはかなり難しいことになるだろう)ここでは、あなたがそれを使用したい方法は次のとおりです。

#!/usr/bin/env tclsh 
proc loadVariablesFromCshellFile {filename arrayName} { 
    upvar 1 $arrayName array 
    set f [open $filename] 
    while {[gets $f line] >= 0} { 
     if {[regexp {^\s*set (\w+)=([""'']?)(.*)\2\s*$} $line -> key quote value]} { 
      set array($key) $value 
     } 
    } 
    close $f 
} 
loadVariablesFromCshellFile vars.sh myvars 
puts $myvars(a) 

それが完全に可能ではあるがTcl側のスカラーグローバルに値をまっすぐにロードすると、実際にはは、Tclプログラム以外のソースからグローバル変数空間を汚染しているので、これはお勧めできません。

+0

ありがとうございました!私はenvとうんざりしたくなかった。しかし、私はそれが最も簡単で簡単な解決策だと思います。 – Wilderness

関連する問題