rlwrap зависает во время работы на заднем плане - PullRequest
2 голосов
/ 28 сентября 2010

У меня проблема с 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 является , вы не должны замечать никакой разницы между командой и командой rlwrap , однако, как описано выше, это свойство не сохраняется.

Может быть, можно предложить альтернативу для rlwrap, которая работает как положено?

Ответы [ 3 ]

2 голосов
/ 28 сентября 2010

В принципе, вы не можете сделать это и заставить это работать.Проблема (с вашей точки зрения) в том, что если вы передадите аргумент файла скрипта в tclsh, он выполнит его и затем завершится.Либо используйте rlwrap tclsh без дополнительных аргументов (так что он работает в интерактивном режиме), либо используйте скрипт, который эмулирует интерактивный REPL Tcl.Это не так уж сложно написать:

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 отлично справится с результатом.

0 голосов
/ 29 сентября 2010

Любая команда, которая выполняется в фоновом режиме, получит SIGTTY, как только она попытается прочитать из стандартного ввода (стандартный ввод) (попробуйте tclsh &). rlwrap всегда будет читать со стандартного ввода, даже если команда rlwrapped этого не делает. Строго говоря, оригинальный постер прав, говоря, что это нарушает предполагаемую прозрачность rlwrap

Это серьезная проблема? Я так не думаю - rlwrap, конечно, полезен только для команд, которые все равно читают из stdin, и нет смысла запускать эти команды в фоновом режиме, с или без rlwrap

Ганс Луб (автор rlwrap)

0 голосов
/ 28 сентября 2010

Я получил похожую проблему в bash, rlwrap bash ./t.sh & , решил эту проблему с помощью экранирования &, rlwrap bash ./t.sh \& .

Это нехорошо, оно будет передаваться & как входной параметр.

...