我有两个tcl脚本。我想在第一次完成时运行第二个脚本。我该怎么办?
答案 0 :(得分:17)
取决于你的意思。
一种方法是编写第三个(“主”)脚本,它将执行
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]
无论当前进程的目录是什么以及项目目录所在的位置,这种方式都可以使用。
答案 1 :(得分:4)
您只需使用source来运行第二个脚本。
source "/tmp/whatever.tcl"
答案 2 :(得分:4)
虽然这通常是一个正确的答案,但由于问题没有得到准确的解决,因此有很多方法可以实现从tcl内运行tcl代码的目标。 我不想详细介绍这一点,因为理解代码的执行是理解tcl itselve的一个主要观点。
源命令不应该以经典的方式与执行脚本混淆,我认为线程启动器已经问过。
源命令就像" include"命令用c / perl / php。 另一方面,像java或python这样的语言只有" import"机制。
不同之处在于这些语言创建了可用包的内部数据库,这些包链接到相应的源/二进制/字节码文件。通过编写import语句,可以加载链接的源代码或字节码或二进制文件。这允许更深入的依赖管理,而无需编写额外的代码。 在tcl中,这可以通过名称空间和包require命令来实现。 例如:
假设你有这个source.tcl:
proc foo {bar} {puts "baz"}
set BAM "BOO"
现在,你有了#34; master"你称之为脚本。我叫它"主要"。它有内容:
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"
如果你可以忍受启动一个全新的解释器实例的额外开销,你也可以这样做:
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
答案 3 :(得分:0)
我能找到的最简单的工作示例:
thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$
thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$ tclsh main.tcl
hello world
7
thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$
thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$ cat main.tcl
lappend auto_path /home/thufir/NetBeansProjects/spawnTelnet/telnet/api
package require weather 1.0
tutstack::hello
set A 3
set B 4
puts [tutstack::sum $A $B]
#puts [tutstack::hello "fred"]
thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$
thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$ cat api/weather.tcl
package provide weather 1.0
package require Tcl 8.5
namespace eval ::tutstack {
}
proc ::tutstack::hello {} {
puts "hello world"
}
proc ::tutstack::sum {arg1 arg2} {
set x [expr {$arg1 + $arg2}];
return $x
}
proc ::tutstack::helloWorld {arg1} {
return "hello plus arg"
}
thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$
thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$ cat api/pkgIndex.tcl
# Tcl package index file, version 1.1
# This file is generated by the "pkg_mkIndex" command
# and sourced either when an application starts up or
# by a "package unknown" script. It invokes the
# "package ifneeded" command to set up package-related
# information so that packages will be loaded automatically
# in response to "package require" commands. When this
# script is sourced, the variable $dir must contain the
# full path name of this file's directory.
package ifneeded weather 1.0 [list source [file join $dir weather.tcl]]
thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$