我对 rlwrap 有疑问(请参阅手册页 here)。考虑这种情况:empty.tcl
是一个空文件。在 bash 这一行
tclsh empty.tcl &
在后台运行作业并退出,所以我得到这个提示
[1]+ 完成 tclsh empty.tcl
。
虽然这条线
rlwrap tclsh empty.tcl &
在后台运行作业并且不退出,所以我得到这个提示
[1]+ 已停止 rlwrap tclsh empty.tcl
。
相应的作业在后台挂起。我的问题是如何让它退出工作而不是挂起?
rlwrap 是一个 Linux 实用命令,它运行指定的命令,拦截用户输入以提供 readline 的行编辑、持久历史记录和完成。正如那里提到的,rlwrap 的主要属性是您不应该注意到命令和 rlwrap 命令之间的任何区别,但是,如上所述,此属性不成立。
也许有人可以建议 rlwrap 的替代方案,其功能如预期?
最佳答案
基本上,您无法做到这一点并让它发挥作用。问题(从您的角度来看)是如果您将脚本文件参数传递给 tclsh
,它将执行它然后退出。要么使用没有更多参数的 rlwrap tclsh
(因此它在交互模式下工作),要么使用模拟 Tcl 交互 REPL 的脚本。这并不难写:
fconfigure stdout -buffering none
set command ""
puts -nonewline "% "
while {[gets stdin line] >= 0} {
append command $line "\n"
if {[info complete $command]} {
# Got a complete command; evaluate and catch result
if {[catch $command msg]} {
puts "error: $msg"
} elseif {$msg ne ""} {
puts $msg
}
set command ""
puts -nonewline "% "
}
}
好的,您可以稍微调整一下,但它显示了如何操作。将它放在您的真实脚本的末尾,rlwrap
应该可以很好地处理结果。
关于linux - rlwrap 在后台运行时挂起作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3810321/