Tcl-приложения в основном завершают работу после завершения сценария, независимо от того, предоставляется он интерактивно или нет.Однако пакет Tk меняет положение вещей так, что когда достигается конец сценария, он вместо этого входит в цикл обработки событий.Если вы полагаетесь на конец файла, вызывающий завершение работы, это будет выглядеть как зависание, но на самом деле оно просто ожидает правильного завершения работы приложения с графическим интерфейсом (поэтому оно может сообщить о состоянии завершения подпроцесса).
Исправление состоит в том, чтобы сделать читаемый каналом обработчик событий для stdin
в подпроцессе.Есть несколько способов сделать это подробно, но вот простой, который может идти в конце основной части кода, которую вы обычно отправляете:
proc ReadFromStdin {} {
if {[gets stdin line] >= 0} {
uplevel "#0" $line
} elseif {[eof stdin]} {
exit
} else {
# Partial read; try later when rest of data available
}
}
fileevent stdin readable ReadFromStdin
Это предполагает, что каждая строка является полной исполняемой командой;это, конечно, может быть неверно, но написание кода для использования info complete
для составления строк менее понятно и, возможно, здесь не нужно.(Вы знаете, что вы на самом деле отправляете лучше меня ...)