Вопрос

Я учусь писать сценарии TCL (expect), и я замечаю, что в некоторых примерах показано использование spawn, в то время как другие показывают команду exec.Я попробовал погуглить, но не могу найти, в чем разница?

Предположим, я вызываю 'exec' в середине сценария с длительным ожиданием, чего я могу ожидать?

Это было полезно?

Решение

spawn является expect команда, а не tcl команда. exec является tcl команда.

spawn создает процесс.Входные и выходные данные процессов подключены к expect для использования другими командами expect: send, expect и interact.

exec создает подпроцесс в tcl.Как правило, tcl приостанавливается до завершения подпроцесса.Однако, один может создайте подпроцесс в фоновом режиме (используя & в качестве последнего аргумента), и если правильно настроить ввод и вывод, tcl сможет взаимодействовать с подпроцессом.Это очень неуклюжее взаимодействие, и это именно тот тип взаимодействия, который expect был разработан для обеспечения бесперебойной работы.

Другие советы

Более простой способ ответить на вопрос - перефразировать его, чтобы спросить, когда вам следует использовать exec против spawn .Короче говоря, используйте spawn для интерактивных команд и exec для неинтерактивных команд.

Также стоит отметить, что некоторые (многие?) Программы ведут себя по-разному при запуске пользователем (т. Е. в командной строке) по сравнению с тем, чтобы быть частью пакетного процесса / запускаться из другого процесса.Фактическая разница заключается в том, есть ли терминал, подключенный к процессу.

Команда spawn, часть расширения Expect для Tcl, настраивает все таким образом, чтобы выполняемая программа считала себя запущенной пользователем, а затем добавляет функциональность, позволяющую программе tcl взаимодействовать с внешней программой удобным способом (т. Е. Сопоставлять ее выходные данные с помощью регулярных выражений и разветвлять эти соответствия).Вещи, запускаемые через spawn, выполняются асинхронно.

Команда exec - это основная команда Tcl, которая запускает другую программу, возвращая ее выходные данные.Он не выполняет никаких сложных настроек, которые выполняет spawn, но может быть очень удобен для простого запуска программы и просмотра ее выходных данных (и возвращаемого кода).Вещи, запускаемые exec, по умолчанию выполняются синхронно, но амперсанд в конце команды заставляет ее выполняться в фоновом режиме (очень похоже на традиционные сценарии командной оболочки).

Команда open, хотя обычно используется для чтения / записи файлов, также может использоваться для запуска внешних процессов.Предваряя имя команды символом канала (|), вы указываете ей запустить внешний процесс и получаете доступ к файловым дескрипторам для чтения / записи для взаимодействия с результирующим процессом.Это своего рода промежуточный этап между exec и spawn, при котором доступно гораздо больше взаимодействия с процессом, но без сложной настройки среды, которую выполняет spawn.Это может быть чрезвычайно удобно для взаимодействия с программами, которые требуют ввода, но все еще достаточно хорошо настроены для автоматизации.

Насколько я знаю, spawn возвращает идентификатор процесса (и связывается с Expect), в то время как exec просто возвращает окончательный стандартный вывод, если вы не передадите "&".Так что это не повлияет на ваши ожидания.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top