如何让tclsh忽略EOF?

时间:2010-09-02 15:33:00

标签: bash shell tcl eof

在csh你可以做到

set ignoreeof

或者在bash tou可以做到

export ignoreeof=1

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

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

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

4 个答案:

答案 0 :(得分:1)

您可能需要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 ...

答案 1 :(得分: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-like系统such as this example from the Tcler's Wiki。您可能需要稍微调整一下,使 Ctrl + D 做你想做的事。

另一种方法是执行此操作,使事物处于熟化模式,只需使 Ctrl + D 非特殊(在OSX上测试):

exec stty eof "" <@stdin

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

tclsh中没有这样的内置功能。<​​/ p>