В чем разница между spawn и exec? - PullRequest
21 голосов
/ 16 февраля 2009

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

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

Ответы [ 4 ]

16 голосов
/ 16 февраля 2009

spawn - это команда expect, а не tcl. exec - это команда tcl.

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

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

16 голосов
/ 01 марта 2009

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

5 голосов
/ 13 апреля 2009

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

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

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

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

0 голосов
/ 16 февраля 2009

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

...