TCL - Как вывести на экран сообщения, которые были напечатаны при выполнении команды exec? - PullRequest
6 голосов
/ 11 мая 2011

Скажем, я хочу выполнить сценарий или исполняемый файл, напечатав во время выполнения выходные данные выполнения.

Когда я делаю:

set log [exec ./executable_file]
puts $log

Затем он долго ждет, а затем печатает все сразу. Но я хочу печать во время выполнения. Как я могу это сделать?

Ответы [ 3 ]

9 голосов
/ 11 мая 2011

Не идеально (так как требует записи во внешний файл):

set log [exec executable_file | tee log.txt >@stdout]

Вывод будет отображен немедленно, в то же время, сохранен в «log.txt». Если вы не заботитесь о сохранении вывода:

set log [exec executable_file >@stdout]
2 голосов
/ 11 мая 2011

Используйте open "| ..." и асинхронное чтение строки из возвращенного дескриптора, например, так:

proc ReadLine fd {
  if {[gets $fd line] < 0} {
    if {[chan eof $fd]} {
      chan close $fd
      set ::forever now
      return
    }
  }
  puts $line
}

set fd [open "| ./executable_file"]
chan configure $fd -blocking no
chan event $fd readable [list ReadLine $fd]

vwait forever

См. эту вики-страницу для более сложных примеров.

Вв реальной программе у вас, вероятно, уже будет запущен цикл обработки событий, поэтому вам не понадобится vwait, специфичный для чтения выходных данных одной команды.

Также, если вам нужно собрать выходные данные, а не просто [puts] в каждой строке после ее прочтения вам, вероятно, потребуется создать глобальную (обычно с пространством имен) переменную, инициализировать ее как "", передать ее имя в качестве еще одного аргумента в процедуру обратного вызова (ReadLine здесь) и добавить строкук значению этой переменной.

0 голосов
/ 11 мая 2011

Может быть, вы можете запустить другой процесс в фоновом режиме перед вашим исполняемым файлом, например tail -f logfile.txt, и вывести результаты своего исполняемого файла в этот файл logfile.txt?

...