3

在 csh 你可以做

set ignoreeof

或者在 bash tou 可以做

export ignoreeof=1

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

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

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

4

4 回答 4

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 的系统,例如 Tcler's Wiki 中的这个示例。您可能需要对其进行一些调整以使Ctrl+D做您想做的事情。

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

exec stty eof "" <@stdin

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

于 2010-09-03T13:19:24.083 回答
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 ...

于 2010-09-03T11:16:34.997 回答
0

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

于 2010-09-02T16:55:01.300 回答
0

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

于 2010-09-02T17:02:28.740 回答