rlwrap在后台运行时挂起作业

时间:2010-09-28 06:48:36

标签: linux bash background tcl rlwrap

我的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的替代品,它的功能如预期的那样?

3 个答案:

答案 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作者)