我的rlwrap有问题(参见手册页here)。考虑这种情况:empty.tcl
是一个空文件。在bash这一行
tclsh empty.tcl &
在后台运行作业并退出,所以我得到了这个提示
[1]+ Done tclsh empty.tcl
。
这一行
rlwrap tclsh empty.tcl &
在后台运行作业并且不退出它,所以我得到了这个提示
[1]+ Stopped rlwrap tclsh empty.tcl
。
相应的作业在后台挂起。我的问题是如何让它退出工作而不是挂起?
rlwrap是一个Linux实用程序命令,运行指定的命令,拦截用户输入以提供readline的行编辑,持久历史记录和完成。正如在那里提到的,rlwrap的主要属性是你不应该注意到命令和rlwrap命令之间的任何区别,但是,如上所述,这个属性不成立。
也许有人可以建议rlwrap的替代品,它的功能如预期的那样?
答案 0 :(得分:2)
基本上,你不能这样做并让它发挥作用。问题(从您的角度来看)是,如果您将脚本文件参数传递给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
应该可以很好地处理结果。
答案 1 :(得分:0)
我在bash中遇到了类似问题 rlwrap bash ./t.sh &
,通过转义&, rlwrap bash ./t.sh \&
解决了这个问题。
这里不好,它会通过&作为输入参数。
答案 2 :(得分:0)
任何在后台运行的命令在尝试从标准输入(标准输入)读取时都会获得SIGTTY(尝试tclsh &
)。 rlwrap
将始终从stdin读取,即使rlwrapped命令没有。严格地说,原始海报说得好,这打破了rlwrap声称的透明度
这是一个严重的问题吗?我不这么认为 - rlwrap
当然只对从stdin读取的命令有用,并且在后台运行这些命令是没有意义的,有或没有rlwrap
Hans Lub(rlwrap作者)