Используйте 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
здесь) и добавить строкук значению этой переменной.