Они почти одинаковы, но детали реализации различаются.
Открытие канала для tee some_file.out
разветвляет новый процесс и запускает служебную программу Unix/Linux tee(1)
strong> в нем. Эта программа читает свой стандартный ввод (то есть все, что вы пишете в канал) и записывает его как в some_file.out
, так и в стандартный вывод (который она наследует от вашей программы).
Очевидно, что это не будет работать под Windows или любой другой системой, которая не поддерживает команду tee
в стиле Unix.
С другой стороны, модуль File::Tee реализован на чистом Perl и не зависит ни от каких внешних программ. Однако, согласно его документации, он также работает, разветвляя новый процесс и запуская под ним то, что по сути является повторной реализацией команды Unix tee
на Perl. Это имеет некоторые преимущества, как указано в документации:
Он реализуется на основе форка, создавая новый процесс для каждого ти-потока. Таким образом, нет проблем с обработкой вывода, созданного внешними программами, работающими с системой или модулями XS. которые не проходят через perlio.
С другой стороны, использование fork
имеет и свои недостатки:
ОШИБКИ
Не работает на Windows (патчи приветствуются).
Если вам нужна реализация tee
на чистом Perl, которая работает на всех платформах, рассмотрите возможность использования IO. ::Tee вместо этого. В отличие от File::Tee, этот модуль реализован с использованием PerlIO и не использует fork
. Увы, это также означает, что он может неправильно фиксировать выходные данные внешних программ, выполняемых с модулями system
или XS, которые обходят PerlIO.
person
Ilmari Karonen
schedule
24.07.2013