2016-04-28 3 views
-3

Есть ли простой способ в Perl для отправки STDOUT или STDERR в несколько мест без разветвления с использованием File :: Tee или открытия трубы до/USR/бен/тройник?просто тройник в Perl без вилки, файл :: Tee или трубопровод для tee

Наверняка есть способ сделать это в чистым perl без написания 20 + строк кода, не так ли? Что мне не хватает? Аналогичные вопросы были заданы, как здесь на так и в других местах, но ни один из ответов не удовлетворяют требованиям, которые я не должны

  • вилки
  • использовать File :: Tee/IO :: Tee/другой модуль + зависимости код которых след 1000x больше, чем мой фактический сценарий
  • открыть трубу фактической команды тройника

Я могу видеть использование основного модуля в качестве компромисса здесь, но на самом деле это то, что нужно?

+1

Ну, вы можете скопировать его вручную, если вы настаиваете на этом. Переназначайте стандартные потоки, запишите их содержимое, а затем поместите их в несколько мест. Вы можете упаковать это в пару опрятных подпрограмм. Почему эти требования? То, о чем вы просите, не так просто, как ваш вопрос заставляет его звучать. – zdim

+0

@ikegami ... это именно то, что я сказал, чего я хочу избежать ... – RaWkStAr

+0

Почему вы хотите это сделать? Что вы пытаетесь достичь? –

ответ

-1

Похоже, что я могу просто сделать это:

BEGIN { 
    open my $log, '>>', 'error.log' or die $!; 

    $SIG{__WARN__} = sub { print $log @_ and print STDERR @_ }; 

    $SIG{__DIE__} = sub { warn @_ and exit 1 }; 
} 

Это просто и эффективно посылает большинство сообщения об ошибках как к исходному STDERR и в лог-файл (по-видимому вещи плененного в Eval не показать, я сказал). Таким образом, есть недостатки в этом, упомянутые в комментариях. Но, как упоминалось в первоначальном вопросе, необходимость была конкретной. Это не предназначено для повторного использования. Это для простого, маленького скрипта длиной не более 100 строк.

Если вы ищете способ сделать это, что это не «рубить», следующий был адаптирован из http://grokbase.com/t/perl/beginners/096pcz62bk/redirecting-stderr-with-io-tee

use IO::Tee; 

open my $save_stderr, '>&STDERR' or die $!; 

close STDERR; 

open my $error_log, '>>', 'error.log' or die $!; 

*STDERR = IO::Tee->new($save_stderr, $error_log) or die $!; 
+1

Хорошо, что вы нашли решение своей проблемы. Отлично сработано. Я думаю, что немногие люди считают это *** простым способом ***, чтобы избежать использования обычных методов, но ваше открытие неоценимо. – Borodin

+3

Это не делает даже отдаленно то, что задает вопрос ... даже если вы написали оба. – hobbs

Смежные вопросы