#expect
#ожидать
Вопрос:
Я хочу «прослушать» строку, выводимую оболочкой, находясь в режиме «взаимодействия». Или я хочу каким-то образом эмулировать режим взаимодействия, который все еще позволяет мне прослушивать определенную строку из командной строки.
Кажется, interact
он прослушивает только вводимые пользователем данные (клавиши, которые я нажимаю), а не то, что возвращается оболочкой.
Как бы я поступил, если бы ожидал выполнения чего-либо каждый раз, когда он видит определенную строку, но в противном случае позволял бы мне беспрепятственно использовать оболочку в интерактивном режиме?.
Пример:
proc yay {} {
send_user "Yayn"
}
trap { # trap sigwinch and pass it to the child we spawned
set rows [stty rows]
set cols [stty columns]
stty rows $rows columns $cols < $spawn_out(slave,name)
} WINCH
spawn bash
interact {
interact -re "HOT" {
yay
}
expect {
fuzz yay
}
}
Если я запускаю это и набираю «ГОРЯЧО», он отвечает «Ура». Как и ожидалось, он прочитал мои ключи. Но если я наберу
echo fuzz
Предложение «expect» не запускается. Также «echo HOT» также ничего не вызовет.
Так возможно ли это или я чего-то не хватает. Возможно, мне нужно было бы эмулировать interact
в каком-то цикле «ожидать, продолжить». Просто важно, чтобы в командной оболочке все работало нормально..
Есть какие-нибудь предложения?
Ответ №1:
Вы можете использовать expect_background
команду. С справочной страницы:
принимает те же аргументы, что и expect, однако оно возвращается немедленно. Шаблоны проверяются всякий раз, когда поступает новый ввод.
Вы можете изменить свой первоначальный сценарий следующим образом:
#!/usr/bin/expect
proc yay {} {
send_user "Yayn"
}
trap { # trap sigwinch and pass it to the child we spawned
set rows [stty rows]
set cols [stty columns]
stty rows $rows columns $cols < $spawn_out(slave,name)
} WINCH
spawn bash
expect_background {
fuzz yay
}
interact -re "HOT" {
yay
}