Вот метод, который работает независимо от того, как записывается STDERR (fd 2), даже если это расширение C, которое не использует переменную Perl STDERR
, чтобы сделать это. Он даже убивает дочерние процессы, которые пишут в STDERR!
{
pipe(my $r, my $w)
or die("Can't create pipe: $!\n");
open(STDERR, '>&', $w)
or die("Can't dup pipe: $!\n");
close($r);
}
print "abc\n";
print "def\n";
print STDERR "xxx\n";
print "ghi\n";
print "jkl\n";
$ perl a.pl
abc
def
$ echo $?
141
Не работает на Windows. Не работает, если вы добавляете обработчик SIGPIPE.
Возможный дубликат [Как запустить системную команду и умереть, если что-нибудь написано в STDERR?] (Http://stackoverflow.com/questions/4377967/how-can-i-run-a-system-command -and-die-if-anything-is-written-to-stderr) –
@sputnick - нет системной команды ... –
написан на stderr на что? (т. е. вы хотите включить другие процессы, запущенные вашим процессом? C-библиотечный код, вызванный вашим perl-кодом? perl-предупреждения? Явные отпечатки на stderr?) – ysth