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

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

system:

   system PROGRAM LIST

как в:

system "abc";

кавычки как в:

`abc`;

пропустить его через трубу, как в:

open ABC, "abc|";

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

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

4 ответа

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

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

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

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

Есть также модули, которые обрабатывают эти детали с кроссплатформенными краями.

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

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

Пожалуйста, обратите внимание, что

readpipe('...')

такой же как

`...`
Другие вопросы по тегам