在 csh 你可以做
set ignoreeof
或者在 bash tou 可以做
export ignoreeof=1
这将使 csh/bash 忽略 EOF,即它不会在 Ctrl+D 或到达末尾或文件时退出。
有没有办法用 tclsh 做同样的事情?
有没有办法让 tclsh 在到达文件末尾时不退出?
如果 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 的系统,例如 Tcler's Wiki 中的这个示例。您可能需要对其进行一些调整以使Ctrl+D做您想做的事情。
另一种方法是这样做,它使事情处于熟化模式,只是使Ctrl+D非特殊(在 OSX 上测试):
exec stty eof "" <@stdin
同样,您需要在退出时重新设置,而且它根本不是特殊的事实可能会在其他地方引起问题;经过上面的那个技巧,它只是一个普通的角色。
您可能想要 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 ...
您也许可以使用trap
TclX 中的命令。
tclsh 中没有这样的内置功能。