1

我正在做一个项目,我想使用 TCL 作为命令解释器。我有一个工作的 c 库对象,我可以从 tcl shell 中加载它,但我的问题是找到一种在启动 tclsh 时自动执行此操作的方法。

本质上,我的最终目标是能够运行脚本并让它加载我的库并运行一些初始启动 tcl 代码,然后以交互模式将我拉回 tclsh 命令提示符。

例如

tclsh -f myscript.tcl --then-switch-to-interactive

或者

EXPORT TCLINIT=myscript.tcl 
tclsh 

基本目标是避免分发 tclsh 而是依赖于本地用户安装的 tcl。我想要分发的只是我的库、一个启动脚本和一个 shell 命令,用于启动预加载库的 tclsh。

我试过使用环境变量TCLINITTCL_LIBRARY但它们似乎没有效果。

到目前为止,我发现的唯一可行的解​​决方案是将“source myscript.tcl”添加/usr/share/tcltk/tcl8.5.init.tcl~/.tclshrc

然而,这两个“解决方案”都不是完美的,因为它们需要修改默认用户工作区。

让我感到震惊的是,在 TCL 中必须有一种方法来处理这个问题,但我的研究到目前为止还没有产生任何结果。

有没有人有什么建议?

4

2 回答 2

0

Tcl 不提供任何替换的能力init.tcl它用于在用户或库代码应该运行之前设置语言的一部分。唯一一次调整它是在打包系统中tclkit(它在那里做了额外的工作来初始化内部虚拟文件系统)。

我也不建议依靠用户来编辑他们的~/.tclshrc,因为那是他们的,而不是你的。在非交互式运行时它也永远不会被获取(嗯,除非你添加代码来实际阅读它)。

相反,我建议您考虑:

  • 将库作为 Tcl 包分发/安装,因此需要它的代码可以执行以下操作:

    package require itsname
    

    像那样,想要它的代码可以只声明事实,而不需要它的代码则不受影响。

  • 使用充当交互式外壳的脚本分发/安装您的库。TclX 包中的commandloop命令在这里可能会有所帮助,但该 Wiki 页面也有您自己的代码。

于 2012-09-19T08:55:31.697 回答
0

在 myscript.tcl 中:

package require Tclx
# Your script
commandloop; # Start interactive session
# other commands

commandloop命令将创建一个交互式命令循环。此时,如果用户键入exit,则脚本将退出而不执行该commandloop行后面的其他命令。另一方面,如果用户键入 Crtl+D 或 Ctrl+Z 退出commandloop,其他命令将被执行。

参考commandloophttp ://wiki.tcl.tk/1968

自定义提示

如果您不喜欢默认提示,请创建一个proc以返回自定义提示并将其传递给commandloop

proc customPrompt {} { return "tcl> " }
commandloop -prompt1 customPrompt
于 2012-09-19T14:28:54.760 回答