在不获取Tcl的情况下从另一个脚本调用过程

时间:2018-11-22 09:59:19

标签: tcl

我对Tcl脚本有一些疑问。是否可以在不采购包含过程的文件的情况下将一个文件中的过程调用到另一个文件中?

2 个答案:

答案 0 :(得分:0)

某事必须source使其可执行的代码,但是它不一定总是您当前的过程。您可以轻松地编写一个单独的脚本来获取和运行该过程,然后通过exec对其进行调用。


示例:

Runner脚本runner.tcl

set arguments [lassign $argv packageInfo commandName]
package require {*}$packageInfo
puts [$commandName {*}$arguments]
exit

使用脚本:

# This just makes using the subprocess a little neater
proc runInPackage {packageInfo args} {
    return [exec [info nameofexecutable] runner.tcl $packageInfo {*}$args]
}

# This will call FooBarProc from version 1.2 of the FooBarPackage
set result [runInPackage {FooBarPackage 1.2} FooBarProc 1 2 3 4 5]

有多种方法可以通过适当的编组技巧来做更复杂的事情……但这足以使您走很长一段路!只要您的论点不是太大。

答案 1 :(得分:0)

您可以使用Tcl的自动加载功能。标准方法是将带有过程的文件放在auto_path变量中列出的目录之一下的某个位置。然后在此目录和文件上运行auto_mkindex命令。这样会在目录中创建一个名为tclIndex的文件。

然后,您可以只使用脚本中的过程,使用时将自动加载它们。

如果需要,您可以发挥更大的创造力。基本上,自动加载功能会在auto_index数组中查找具有过程名称的元素。数组元素的值应为将要执行的命令,并应导致创建过程(或命令)。

示例:假设/ usr / share / tcl在您的auto_path中(默认情况下,您也可以使用不在auto_path中的目录,但是您必须在每个脚本的开头添加该目录)。您在/ usr / share / tcl下创建一个名为helpers的目录。在该目录中,使用一些您希望对所有脚本可用的命令创建文件。就像一个名为cat.tcl的文件:

proc cat {filename} {
    if {[catch {open $filename} fd opts]} {
        return -options [dict incr opts -level] -errorinfo "" $fd
    }
    try {
        return [read -nonewline $fd]
    } finally {
        close $fd
    }
}

然后启动tclsh(对于指示的目录,您可能需要以root身份执行此操作)并运行以下命令:

auto_mkindex /usr/share/tcl helpers/*.tcl

这将在/ usr / share / tcl中创建一个名为tclIndex的文件。从那时起,您可以只在任何Tcl会话或脚本中使用cat命令:

cat /etc/motd