В чем разница между spawn и exec?
Вопрос
Я учусь писать сценарии 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 просто возвращает окончательный стандартный вывод, если вы не передадите "&".Так что это не повлияет на ваши ожидания.