【问题标题】:How to make tclsh to ignore EOF?如何让 tclsh 忽略 EOF?
【发布时间】:2010-09-02 15:32:59
【问题描述】:

在 csh 你可以做到

set ignoreeof

或者在 bash 头可以做

export ignoreeof=1

这将使 csh/bash 忽略 EOF,即它不会在 Ctrl+D 或到达末尾或文件时退出。

有没有办法用 tclsh 做同样的事情?

有没有办法让 tclsh 在到达文件末尾时不退出?

【问题讨论】:

  • 您的意思是在交互式 tclsh 会话中忽略 ^D 吗?
  • 实际上我希望 tclsh 在我调用 tclsh something.tcl 时不要退出。在交互式会话中忽略 ^D 将产生解决方案
  • 查看 Brian Oakley 对 .tclsh 的最后评论 - 这听起来像是您想要的。
  • 在 shell 中到达 EOF 究竟意味着什么?我们在谈论什么文件,这将如何影响我在 bash 中所做的其他事情?
  • 感谢csh 提示。我遇到了csh 捕获我的 ctrl-d... 并阻止注销的问题。直到我发现set ignoreeof。我能够注释掉这个set 命令。

标签: bash shell tcl eof


【解决方案1】:

如果 tclsh 正在运行一个脚本,它不会在检测到 stdin 上的 EOF 时退出;这纯粹是内置 REPL 的一个特性。您可以使用eof stdin 自己检测这种情况,此时您可以决定如何处理。

如果您想让 Ctrl+D 不是 EOF,那么最简单的方法是将终端置于原始模式,如下所示:

set sttySettings [exec stty -g <@stdin]
exec stty -echo raw <@stdin

完成后,像这样切换回来:

exec stty $sttySettings <@stdin

确保在程序退出之前切换回来!

另一件事是,如果您使用原始输入,您必须自己处理所有行编辑。一个方便的方法是使用纯 Tcl readline-alike 系统such as this example from the Tcler's Wiki。您可能需要对其进行一些调整以使 Ctrl+D 做您想做的事情。

另一种方法是这样做,它使事情处于熟化模式,只是使 Ctrl+D 非特殊(在 OSX 上测试):

exec stty eof "" <@stdin

同样,您需要在退出时重新设置,而且它根本不特殊的事实可能会导致其他地方出现问题;经过上面的那个技巧,它只是一个普通的角色。

【讨论】:

    【解决方案2】:

    您可能需要 Expect:将其保存为 tclsh.exp

    #! /usr/bin/env expect
    log_user 0
    spawn tclsh
    if {[llength $argv] > 0} {
        send -- "set argv [list [lrange $argv 1 end]]; source [lindex $argv 0]\r"
    }
    interact
    

    然后运行tclsh.exp somefile.tcl arg arg ...

    【讨论】:

      【解决方案3】:

      您也许可以使用 TclX 中的trap 命令。

      【讨论】:

      • 那是用于信号处理的,文件结尾不是信号。
      • 您可能仍想使用trap,即使只是在 SIGINT 或 SIGTSTP 等真实信号上将终端重置为正常。
      【解决方案4】:

      tclsh 中没有这样的内置功能。

      【讨论】:

      • 那我该如何实现呢?
      • @vahagn:你为什么需要这样做?你想解决什么问题?
      • @Bryan Oakley:我正在开发一个基于 tclsh 的 shell 环境,在启动该环境时我需要做一些初始化工作。所以我需要 tclsh 来获取一些 init.tcl 并留在交互式会话中(不要在文件 init.tcl 末尾读取 ^D 时退出它)。
      • @vahagn:那么您可以简单地使用[source] 命令,而不是将 init.tcl 作为命令行参数传递。或者您是否想知道其他事情:比如首先如何编写基于 tclsh 的 shell?
      • @vahagn:你熟悉 .tclsh 文件吗?如果它存在于您的主目录中,它将在启动时获取。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多