вызывая встроенные команды bash из tclsh - PullRequest
3 голосов
/ 04 января 2012

У меня есть скрипт tclsh, в котором мне нужно было выполнить определенную команду в фоновом режиме.Я мог бы добиться этого из tcl, используя команду exec: exec myprog &.

Но как мне ждать завершения myprog из tcl.Команда wait не является автономной утилитой, поэтому я могу использовать ее с exec.Команда wait является встроенной оболочкой.Пожалуйста, дайте мне знать, как я могу ждать фонового процесса в сценарии tclsh.

PS: я использую #! / Usr / bin / env tclsh shebang в моем скрипте.

1 Ответ

3 голосов
/ 04 января 2012

Если вы хотите выполнить команду в фоновом режиме в Tcl, вы можете перейти к следующему:

proc cb { fd } {
        gets $fd buf
        append ::output $buf
        if {[eof $fd]} {
            close $fd
            set ::finished 1
        }
}

set command "<command to execute>"
set ::output ""
set ::finished 0
set fd [open "|$command" r]
fconfigure $fd -blocking no
fileevent $fd readable "cb $fd"
vwait ::finished
puts $::output

Использование open с | перед командойпозволит вам «открыть» трубу для команды.Использование fconfigure для установки неблокирования позволит вам читать с него, не блокируя другие процессы в скрипте.fileevent будет вызывать указанный метод обратного вызова (в данном случае cb) всякий раз, когда есть данные для чтения (таким образом, флаг readable).vwait будет следить за тем, чтобы сценарий не продолжался до тех пор, пока не будет записана указанная переменная, поэтому $command будет выполняться в фоновом режиме, что позволит интерфейсу Tk оставаться отзывчивым и ждать, пока вы не захотите продолжить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...