Каковы различия между системой и обратными окнами и трубами в Perl?

Perl поддерживает три способа (которые я знаю) запуска внешних программ:

system:

   system PROGRAM LIST

как в:

system "abc";

backticks как в:

`abc`;

выполняется через трубу, как в:

open ABC, "abc|";

Каковы различия между ними? Вот что я знаю:

  • Вы можете использовать backticks и pipe, чтобы легко получить вывод команды.
  • что он (больше в будущих изменениях?)

Ответ 1

  • system(): запускает команду и возвращает команду статус выхода
  • backticks: запускает команду и возвращает команду вывод
  • pipe: запускает команду и позволяет использовать их как дескриптор

Также backticks перенаправляет исполняемую программу STDOUT на переменную, и система отправляет ее в вашу основную программу STDOUT.

Ответ 2

Документация perlipc объясняет различные способы взаимодействия с другими процессами с Perl и открытая документация perlfunc объясняет файловые дескрипторы файлов.

  • Система отправляет свой вывод на стандартный вывод (и ошибку)
  • Backticks фиксирует стандартный вывод и возвращает его (но не стандартную ошибку)
  • Открытые каналы позволяют захватывать вывод и читать его из дескриптора файла или печатать в дескрипторе файла и использовать его как вход для внешней команды.

Существуют также модули, которые обрабатывают эти детали с кросс-платформенными крайними случаями.

Ответ 3

Система

также возвращает значение выхода приложения (ERRORLEVEL в Windows). Трубы немного сложнее в использовании, так как чтение из них и их закрытие добавляет дополнительный код. Наконец, они имеют различную реализацию, которая должна была делать разные вещи. Используя каналы, вы можете общаться с исполняемыми приложениями, в то время как другие команды не позволяют это (легко).

Ответ 4

Получение статуса выхода программы не ограничивается system(). Когда вы вызываете close(PIPE), он возвращает статус выхода, и вы можете получить последний статус выхода для всех 3 методов из $?.

Также обратите внимание, что

readpipe('...')

совпадает с

`...`