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

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

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


person Milan Babuškov    schedule 16.02.2009    source источник


Ответы (4)


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

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

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

person Andrew Stein    schedule 16.02.2009

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

person donlibes    schedule 01.03.2009

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

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

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

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

person RHSeeger    schedule 13.04.2009
comment
Примером такой программы по иронии судьбы является tclsh. - person Johannes Kuhn; 07.11.2014

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

person Mark    schedule 16.02.2009