Хотя я хорошо знаком с Tcl, это вопрос начинающего. Я хотел бы читать и писать из трубы. Я хотел бы решение в чистом Tcl и не использовать библиотеку вроде Expect. Я скопировал пример из wiki tcl, но не смог запустить его.Простая программа, которая читает и записывает в трубу
Мой код:
cd /tmp
catch {
console show
update
}
proc go {} {
puts "executing go"
set pipe [open "|cat" RDWR]
fconfigure $pipe -buffering line -blocking 0
fileevent $pipe readable [list piperead $pipe]
if {![eof $pipe]} {
puts $pipe "hello cat program!"
flush $pipe
set got [gets $pipe]
puts "result: $got"
}
}
go
Выход executing go\n result:
, однако я бы ожидать, что при чтении значения из трубы будет возвращать строки, которые я послал в программе кошачьих.
Какая у меня ошибка?
-
EDIT:
Я последовал ответ potrzebie и получил небольшой пример работает. Этого достаточно, чтобы заставить меня идти. Быстрое обходное решение для тестирования моей установки - это следующий код (не настоящее решение, а быстрое решение на данный момент).
cd /home/stephan/tmp
catch {
console show
update
}
puts "starting pipe"
set pipe [open "|cat" RDWR]
fconfigure $pipe -buffering line -blocking 0
after 10
puts $pipe "hello cat!"
flush $pipe
set got [gets $pipe]
puts "got from pipe: $got"
Я упомянул «после» только для демонстрации, извините, если это было непонятно.Это нехорошее решение, потому что он всегда ждет фиксированного количества времени, и вы хотите, чтобы скрипт немедленно ответил, когда есть строка для чтения. Если вы используете 'after' в любом случае (это проще, чем настройка обработчика' fileevent'), вы должны сделать это * повторно * до тех пор, пока не получите строку с 'gets'. – potrzebie
Было ясно. Мне просто нужен был быстрый пример, который работает сейчас, я всегда могу улучшить код. Я тоже попробовал fileevent, но, вероятно, имел ошибку в моем коде. Также я хочу, чтобы код tcl вызывал мою собственную программу, написанную на другом языке. Еще раз спасибо за ваш ответ. – mrsteve