Ожидать — ожидание при взаимодействии

#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
}