Каковы различия между системой и backticks и трубы в Perl?
Perl поддерживает три способа (которые я знаю) запуска внешних программ:
system
:
system PROGRAM LIST
как в:
system "abc";
кавычки как в:
`abc`;
пропустить его через трубу, как в:
open ABC, "abc|";
Каковы различия между ними? Вот что я знаю:
- Вы можете использовать обратные тики и каналы, чтобы легко получить выходные данные команды.
- вот и все (больше в будущих правках?)
4 ответа
- system(): запускает команду и возвращает статус завершения команды
- backticks: запускает команду и возвращает вывод команды
- pipe: запускает команду и позволяет использовать их как дескриптор
Также backticks перенаправляет STDOUT исполняемой программы в переменную, и система отправляет его в STDOUT вашей основной программы.
Документация perlipc объясняет различные способы взаимодействия с другими процессами из Perl, а открытая документация perlfunc объясняет переданные файловые дескрипторы файлов.
- Система отправляет свой вывод на стандартный вывод (и ошибка)
- Обратные метки фиксируют стандартный вывод и возвращают его (но не стандартную ошибку)
- Открытие по конвейеру позволяет вам захватывать выходные данные и читать их из файлового дескриптора или печатать в файловый дескриптор и использовать его в качестве входных данных для внешней команды.
Есть также модули, которые обрабатывают эти детали с кроссплатформенными краями.
Система также возвращает значение выхода из приложения (ERRORLEVEL в Windows). Каналы немного сложнее в использовании, так как их чтение и закрытие добавляет дополнительный код. Наконец, они имеют различную реализацию, которая должна была делать разные вещи. Используя каналы, вы можете общаться с выполненными приложениями, в то время как другие команды не позволяют этого (легко).
Получение статуса выхода из программы не ограничивается system()
, Когда вы звоните close(PIPE)
, он возвращает статус выхода, и вы можете получить последний статус выхода для всех 3 методов из $?
,
Пожалуйста, обратите внимание, что
readpipe('...')
такой же как
`...`