2

我对 rlwrap 有疑问(请参阅此处的手册页)。考虑这种情况: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 的主要属性是您不应该注意到 command 和 rlwrap command 之间的任何区别,但是,如上所述,此属性不成立。

也许有人可以为 rlwrap 提出一种替代方案,它可以按预期工作?

4

3 回答 3

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应该可以很好地处理结果。

于 2010-09-28T08:01:44.510 回答
0

任何在后台运行的命令在尝试从标准输入(标准输入)(try)读取时都会得到一个 SIGTTY tclsh &rlwrap将始终从标准输入读取,即使 rlwrapped 命令不读取。严格来说,原始发帖人说这打破了 rlwrap 声称的透明度是正确的

这是一个严重的问题吗?我不这么认为——rlwrap当然只对从标准输入读取的命令有用,在后台运行这些命令没有意义,不管有没有 rlwrap

Hans Lub(rlwrap 作者)

于 2010-09-28T21:34:13.350 回答
0

我在 bash, 中遇到了类似的问题 rlwrap bash ./t.sh & ,通过转义 &, 解决了这个问题 rlwrap bash ./t.sh \&

这在这里不好,它将 & 作为输入参数传递。

于 2010-09-28T07:00:18.327 回答