【问题标题】:Tcl interact after sourcing a file.tclTcl 在获取 file.tcl 后进行交互
【发布时间】:2013-10-15 06:29:49
【问题描述】:

我想在 Tcl 提示中获取文件后进行交互。 即,

]$ tclsh myCode.tcl

// 执行我的代码

% // 在 myCode.tcl 中进入交互模式

【问题讨论】:

  • this question - 这是重复的。
  • @JohannesKuhn 你到底在说什么?那个是关于与下属进程交互的,而这是关于与当前解释器交互的。
  • 问题是一样的:“我怎样才能在interp中执行一些东西并给用户交互式shell?”。 expect 标签无助于说服我。 (XY Problem)
  • “当前interp”/“从属进程”是一个关键的区别因素,会导致非常不同的解决方案。 (readline 标签指出这是一个本地进程问题。)

标签: tcl expect readline


【解决方案1】:

最简单的方法是使用TclX extension 中的commandloop 命令。

package require Tclx

#... define things and run things...

# Let the user issue commands
commandloop

上面链接的 wiki 页面讨论了如何在不使用 TclX 的情况下做到这一点。

【讨论】:

  • 可以,但是必须输入命令的全名;仅使用命令名称的第一部分不起作用(如在 tclsh 中),这是为什么呢?
  • 有没有办法通过这种方法获得像rlfe tclsh 这样的编辑功能?
【解决方案2】:

恐怕我对此的了解太少,或者过于简化了,但是……这不是您需要的 interact 命令吗?

如果您希望 Tcl/Expect 做某事,然后将控制权交还给用户,请查看以下手册页链接中的交互命令:

http://www.tcl.tk/man/expect5.31/expect.1.html

【讨论】:

  • interact 报错说:cannot interact with self-set spawn_id to spawned process
  • 嗯...所以我猜你没有产生另一个进程并使用Expect,那么?如果是这样,那么交互命令将毫无用处。抱歉,我以为您在 Tcl 中使用了 Expect。
【解决方案3】:

如果您宁愿在没有任何外部包的纯 tcl 中执行此操作,则 tclsh 提示符的最简单实现确实非常简单。把这个放在myCode.tcl的末尾:

fileevent stdin readable {
    puts [eval [gets stdin]]
}

vwait forever

您甚至可以将其作为一个独立程序来实现,该程序为您的其他 tcl 脚本提供源代码。

当然,上面的示例代码非常简单,它甚至不会打印提示或处理多行命令之类的东西,但它是您修改和自定义的一个很好的起点。

【讨论】:

  • 我喜欢这个。我对其进行了一些更改,以使其具有实际外壳 @9​​87654323@ 的感觉
【解决方案4】:

您可以尝试tkcon,这是一个交互式 tclsh,它创建一个单独的窗口。我用第一行写了一个小shell脚本mytclsh

#!/usr/bin/tkcon myscript.tcl

并使其可执行 (chmod 755 mytclsh)。这将执行myscript.tcl,然后进行交互。这里有更多关于tkcon的信息:https://wuhrr.wordpress.com/2011/01/13/a-solution-for-tclsh-editing-woes/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-18
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    • 2021-09-17
    相关资源
    最近更新 更多