В чем разница между spawn и exec?
Я учусь писать сценарии TCL (expect), и я замечаю, что некоторые примеры показывают использование spawn, в то время как другие показывают команду exec. Я пробовал гуглить, но не могу найти, в чем разница?
предположим, я вызываю "exec"в середине сценария долгого ожидания, что я могу ожидать?
4 ответов
spawn
Это . exec
- это .
spawn
создает процесс. Вход и выход процессов подключены к expect для использования другими командами expect:send
, expect
и interact
.
exec
создает подпроцесс под tcl. В общем случае tcl приостанавливается до завершения подпроцесса. Однако один can создать подпроцесс в фоновом режиме (используя и в качестве последнего аргумент), и если правильно подключить вход и выход, tcl может взаимодействовать с подпроцессом. Это очень неуклюже и именно такое взаимодействие, которое ожидалось, было разработано для плавной обработки.
более простой способ ответить на вопрос-перефразировать его, чтобы спросить, когда вы должны использовать exec vs spawn. Короче говоря, используйте spawn для интерактивных команд и exec для неинтерактивных команд.
также стоит отметить, что некоторые (многие?) программы ведут себя по-разному при запуске пользователем (т. е. в командной строке) и являются частью пакетного процесса/запускаются из другого процесса. Фактическая разница заключается в том, есть ли терминал, подключенный к процессу.
команда spawn, часть расширения Expect для Tcl, устанавливает вещи так, чтобы выполняемая программа считала себя запущенной пользователем, а затем добавляет функциональность, позволяющую программе tcl взаимодействовать с внешней программой в удобный способ (т. е. соответствие его выходу через регулярные выражения и ответвление от этих совпадений). Вещи, выполняемые через spawn, выполняются асинхронно.
команда exec-это основная команда Tcl, которая запускает другую программу, возвращая ее вывод. Он не выполняет никаких сложных настроек, которые делает spawn, но может быть очень удобен для запуска программы и просмотра ее вывода (и кода возврата). Вещи, выполняемые exec, по умолчанию выполняются синхронно, но амперсанд в конце команда заставляет его работать в фоновом режиме (как и традиционные сценарии оболочки).
команда open, хотя обычно используется для чтения / записи файлов, также может использоваться для запуска внешних процессов. Предшествуя имени команды символом канала ( | ), вы предлагаете ей запустить внешний процесс и получить доступ к дескрипторам файлов чтения/записи для взаимодействия с результирующим процессом. Это своего рода середина между exec и spawn, с гораздо большим взаимодействием с процессом доступный, но без сложной экологической установки, которую делает spawn. Это может быть очень удобно для взаимодействия с программами, которые требуют ввода, но все еще довольно хорошо настроены для автоматизации.
насколько я знаю, spawn возвращает идентификатор процесса (и ссылки с Expect), в то время как exec просто возвращает окончательный stdout, если вы не передадите "&". Так что это не повлияет на ваши ожидания.