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

最佳答案

基本上,您不能执行此操作并使其起作用。问题(从您的 Angular 来看)是,如果将脚本文件参数传递给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/

10-13 03:19