如何覆盖默认的init.tcl

时间:2012-09-18 21:36:25

标签: shell tcl

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

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

e.g。

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必须有办法处理这个问题,但到目前为止我的研究还没有产生任何结果。

有人有任何建议吗?

2 个答案:

答案 0 :(得分:0)

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

我也不建议依赖用户编辑他们的~/.tclshrc,因为那是他们的而不是你的。当非交互式运行时,它也永远不会被采购(好吧,除非您添加代码以实际读取它)。

相反,我建议您考虑:

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

    package require itsname
    

    就像这样,想要它的代码只能声明不受影响的事实和代码。

  • 使用充当交互式shell的脚本分发/安装库。来自commandloopTclX package命令可能会有帮助,但该Wiki页面也有自己的代码。

答案 1 :(得分:0)

在myscript.tcl中:

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

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

commandloop的参考:http://wiki.tcl.tk/1968

自定义提示

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

proc customPrompt {} { return "tcl> " }
commandloop -prompt1 customPrompt