Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何使tclsh忽略EOF?_Bash_Shell_Tcl_Eof - Fatal编程技术网

Bash 如何使tclsh忽略EOF?

Bash 如何使tclsh忽略EOF?,bash,shell,tcl,eof,Bash,Shell,Tcl,Eof,在csh你可以 set ignoreeof 或者在bash tou可以做什么 export ignoreeof=1 这将使csh/bash忽略EOF,也就是说,它不会在Ctrl+D时退出,或者在到达末尾或文件时退出 有没有办法让tclsh也这么做 有没有办法使tclsh在到达文件末尾时不退出?您可以使用TclX中的trap命令。tclsh中没有此类内置功能。您可能希望:将其另存为tclsh.exp #! /usr/bin/env expect log_user 0 spawn tclsh i

在csh你可以

set ignoreeof
或者在bash tou可以做什么

export ignoreeof=1
这将使csh/bash忽略EOF,也就是说,它不会在Ctrl+D时退出,或者在到达末尾或文件时退出

有没有办法让tclsh也这么做


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

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

tclsh中没有此类内置功能。

您可能希望:将其另存为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…

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

如果要使Ctrl+D不是EOF,则最简单的方法是将终端置于原始模式,如下所示:

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

设置sttySettings[exec stty-g您的意思是在交互式Tcsh会话中忽略^D吗?实际上,我希望在调用tclsh something.tcl时,Tcsh不要退出。在交互式会话中忽略^D将产生一个解决方案查看Brian Oakley最后对.tclsh的评论-听起来像是您想要的。在shell中达到EOF实际上意味着什么?什么我们谈论的是什么?这将如何影响我在bash中所做的其他事情?感谢
csh
提示。我在
csh
捕获我的ctrl-d…并防止注销方面遇到问题。直到我发现
set ignoreof
。我能够注释出这个
set
命令。那么我如何实现它呢?@vahagn:你为什么需要?你想解决什么问题?@Bryan Oakley:我正在开发一个基于tclsh的shell环境,在启动该环境时我需要做一些初始化工作。因此我需要tclsh来获取一些init.tcl并保持交互式会话(不要在读取init.tcl文件末尾的^D时退出它)@vahagn:那么你只需使用
[源代码]
command,而不是将init.tcl作为命令行参数传递。或者您想知道其他事情:比如如何首先编写基于tclsh的shell?@vahagn:您熟悉.tclsh文件吗?如果它存在于您的主目录中,则将在启动时获取它。这是用于信号处理的,文件结尾不是信号。您可能bly仍然希望使用
陷阱
,即使只是在实际信号(如SIGINT或SIGTSTP)上将终端重置为正常。
exec stty eof "" <@stdin