2016-12-28 6 views
0

두 개의 별도 스크립트 (C 쉘과 TCL 중 하나)에서 사용되는 변수가 있습니다. 한 번 정의하고 두 스크립트 모두에 액세스하는 방법이 있습니까?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 

두 개의 서로 다른 형식으로 동일한 변수를 저장하기 위해 두 개의 개별 파일을 생성하는 아이디어를 좋아하지 않습니다. 단일 vars 파일을 사용하고 C 쉘과 TCL에서 사용할 수있는 변수가있는 방법이 있습니까?

답변

1

가장 간단한 방법은 부모 프로세스에서 자식 프로세스에 상속되므로 변수를 환경 변수로 만드는 것입니다. (티클면에, 그들은 ::env 글로벌 배열의 요소있어, 상기 C 쉘 측에, 이들은 다른 모든 변수와 같이 판독 될 수 있지만 setenv 통해 설정 될 필요가있다.)

하나의 구성 파일이 공유 두 언어가 다른 구문을 사용하기 때문에 훨씬 더 어렵습니다. 따옴표 붙이는 방법으로 복잡한 것을 사용하지 않으면 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