В чем разница между spawn и exec?

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

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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