2012-02-14 3 views

답변

15

실제로 의미하는 바에 따라 다릅니다.

한 가지 방법은

source /the/path/to/the/first.tcl 
source /the/path/to/the/second.tcl 

또 다른 방법은 바로 첫 번째 스크립트의 바닥에 위의 예에서 source에 두 번째 전화를 추가하는 것입니다 할 것 세 번째 ("마스터") 스크립트를 작성하는 것입니다. 첫 번째 방법에

개정 : 스크립트가 source에 마스터 스크립트, 관용적 방법과 동일한 디렉토리에있는 실행하는 경우 그들 소싱 상관없이 무엇을 작동하지 않습니다

set where [file dirname [info script]] 
source [file join $where first.tcl] 
source [file join $where second.tcl] 

이 방법은 현재 프로세스의 디렉토리는 프로젝트 디렉토리가 위치한 곳입니다.

3

원본을 사용하여 두 번째 스크립트를 실행하면됩니다.

source "/tmp/whatever.tcl" 
1

문제가 precicely TCL 내에서 TCL 코드를 실행하는 목표를 실현하려 방법의 톤이있다 공식화되지 않은 렸기 때문에이 일반적으로 정답된다. 코드 실행을 이해하는 것이 tcl itselve를 이해하는 데 중요한 점 중 하나이기 때문에 자세히 설명하지 않겠습니다.

소스 명령이 고전적인 방법으로 스크립트를 실행과 혼동해서는 안 소스

있다, 내가 스레드 스타터 요청했다 생각.

source 명령은 c/perl/php의 "include"명령과 같습니다. 반면 Java 나 python과 같은 언어는 "가져 오기"메커니즘 만 갖고 있습니다.

차이점은 해당 소스/바이너리/바이트 코드 파일에 링크 된 사용 가능한 패키지의 내부 데이터베이스를 만드는 것입니다. import 문을 작성함으로써 링크 된 소스 또는 바이트 코드 또는 바이너리 파일이로드됩니다. 따라서 추가 코드를 작성하지 않고도 더 많은 종속성을 관리 할 수 ​​있습니다. tcl에서 이것은 네임 스페이스와 패키지 require 명령으로 달성 할 수 있습니다. 예 :

는이 source.tcl가 있다고 가정 : 당신이 그것을 전화처럼

proc foo {bar} {puts "baz"} 
set BAM "BOO" 

지금, 당신은 당신의 "마스터"스크립트가 있습니다. 나는 그것을 "main"이라고 부른다. 이 내용이 있습니다

set BAM {my important data} 
source source.tcl 
#also the function foo can now be used, becouse source reads the whole script 
foo {wuz} 
set BAM 
#will output "BOO" 

exec 명령

당신은 당신이 할 수있는 완전히 새로운 인터프리터 인스턴스를 시작의 추가 오버 헤드 살 수있는 경우도 수행

set BAM {my important data} 
exec tclsh source.tcl 
#The variable BAM will not be modified. You can not use the function foo. 

평가 후면 명령

Eval은 프로그래밍 된 코드처럼 문자열이나 목록을 평가할 수 있습니다 (tcl에서는 모든 것이 문자열입니다). 전체 소스 파일을 문자열로로드해야합니다. 그런 다음 eval을 사용하여 분리 된 범위 내의 코드를 평가하고 주 소스 파일의 내용을 덮어 쓰지 않습니다.

set fp [open "somefile" r] 
set code_string [read $fp] 
close $fp 
eval $code_string