Чтобы запустить команду в фоновом режиме и зафиксировать результаты, вам нужно открыть конвейер и выполнить все асинхронно. (Команда exec
может запускать вещи в фоновом режиме, если &
является ее последним аргументом, но не во время захвата результатов.)
bind pub -|- !tt proc:tt
proc proc:tt {nick host handle channel arg} {
set search [lindex [split [stripcodes bcu $arg]] 0]
foreach name {name1 name2 name3 name4 name5} {
# Launch the subprocess
set pipe [open |[list sh search.sh $name $search]]
# Set up a handler for when the subprocess produces *any* output *or* finishes
fconfigure $pipe readable [list handle:search:output $channel $pipe $name]
}
putnow "PRIVMSG $channel processing..."
}
proc handle:search:output {channel pipe name} {
set line [gets $pipe]
if {[eof $pipe]} {
close $pipe
putnow "PRIVMSG $channel search for $name done"
return
}
putnow "PRIVMSG $channel :result($name): $line"
}
Обратите внимание, что при этом все поиски запускаются параллельно. Это может загрузить вашу систему совсем немного! Это также может привести к результатам в произвольном порядке. Выполнение операций в порядке возможно , но требует либо более сложного кода с ручной передачей продолжения, либо сопрограмм (Tcl 8.6 или новее). Или вы можете передать последовательность действий подпроцессу: это просто.