tcl - 从另一个脚本调用过程而不使用 Tcl
问题描述
我对 Tcl 脚本有一些疑问。是否可以在不获取包含过程的文件的情况下将一个文件中的过程调用到另一个文件?
解决方案
您可以使用 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
推荐阅读
- elixir - 如何在 Phoenix LiveView 中测试 handle_info/2?
- azure - 如何从不同的变量组 Azure Pipeline 访问相同的变量?
- c# - 数据绑定不适用于在 ItemsControl 中用作 DataTemplter 的 UserControl
- python - 导入本地 .py 文件时如何确保导入包
- java - 无法使用 Mockito 模拟带注释的字段
- flutter - Flutter:如何创建上一个和下一个项目较小的 PageView?
- c# - 使用 SQL 或 LINQ 查找行中的转折点
- spring - 考虑在你的配置中定义一个 'org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder' 类型的 bean
- extjs - ExtJS 6.2 更新时绑定视图模型的问题
- c# - 哪种方法可以更好地提高字典的复杂性?