2

rlwrap に問題があります (こちらのマニュアルページを参照してください)。次の状況を考慮してください:empty.tclは空のファイルです。この行をbashで

tclsh empty.tcl &

バックグラウンドでジョブを実行して終了するため、このプロンプトが表示されます

[1]+ Done tclsh empty.tcl.

この行が

rlwrap tclsh empty.tcl &

バックグラウンドでジョブを実行し、終了しないため、このプロンプトが表示されます

[1]+ Stopped rlwrap tclsh empty.tcl.

対応するジョブがバックグラウンドでハングします。私の質問は、ハングするのではなくジョブを終了させる方法ですか?

rlwrap は、指定されたコマンドを実行し、readline の行編集、永続的な履歴、および補完を提供するためにユーザー入力をインターセプトする Linux ユーティリティ コマンドです。そこに記載されているように、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 "% "
    }
}

OK、もう少し微調整できますが、その方法を示しています。実際のスクリプトの最後に貼り付けれrlwrapば、結果に問題なく対応できるはずです。

于 2010-09-28T08:01:44.510 に答える
0

私はbashで同様の問題を抱えており rlwrap bash ./t.sh & 、&、をエスケープすることでそれを解決しました rlwrap bash ./t.sh \&

これはここでは良くありません。入力パラメータとして&を渡します。

于 2010-09-28T07:00:18.327 に答える
0

バックグラウンドで実行されるコマンドは、stdin (標準入力) から読み取ろうとするとすぐに SIGTTY を取得します (try tclsh &)。rlwraprlwrapped コマンドがそうでない場合でも、常に stdin から読み取ります。厳密に言えば、元の投稿者は、これが rlwrap の透明性を損なうと言っているのは正しいです。

これは深刻な問題ですか?私はそうは思いません-rlwrapもちろん、とにかくstdinから読み取るコマンドにのみ役立ちます.rlwrapの有無にかかわらず、これらのコマンドをバックグラウンドで実行しても意味がありません

Hans Lub (rlwrap 作者)

于 2010-09-28T21:34:13.350 に答える