Как я могу избавиться от STDERR в Perl - PullRequest
7 голосов
/ 25 февраля 2011

Я использую некоторые системные команды в Perl.

В приведенном ниже случае я получаю вывод следующим образом:

ls: import-log.*: No such file or directory

ls: error-log.*: No such file or directory

No specified files found for deletion

Мой код:

sub monthoryear() 
{

  @importlog = `ls -al import-log.*`;

  @errorlog = `ls -al error-log.*`;

}

Не знаюЯ не хочу видеть следующее в выводе, даже если нет файлов.

ls: import-log.*: No such file or directory &

ls: error-log.*: No such file or directory

Ответы [ 7 ]

14 голосов
/ 25 февраля 2011

В то время как другие ответы верны относительно того технического вопроса, который вы задали, вам также следует подумать о том, чтобы не писать что-то вроде сценария оболочки в Perl.

Вы должны использовать нативные методы Perl для получения списка файлов (например, glob() или File::Find) вместо вызова обратного символа ls.

6 голосов
/ 25 февраля 2011

Перенаправить STDERR на нулевое устройство:

use File::Spec;
open STDERR, '>', File::Spec->devnull() or die "could not open STDERR: $!\n";
5 голосов
/ 25 февраля 2011

Вы можете добавить stderr перенаправление в ваших командах подоболочки:

@importlog = `ls -al import-log.* 2>/dev/null`;
@errorlog = `ls -al error-log.* 2>/dev/null`;
4 голосов
/ 25 февраля 2011

Выезд perlfaq8 . Если вам все равно, если STDOUT или STDERR, вы можете перенаправить оба на STDOUT.

$output = `$cmd 2>&1`;

В вашем случае вы, вероятно, просто хотите избавиться от STDERR:

$output = `$cmd 2>/dev/null`;

Однако я согласен с ответом ДВК . Использование внешней команды для получения списка файлов кажется глупым. Вы должны использовать File :: Find . Таким образом, вы можете использовать обычную обработку ошибок Perl на случай, если что-то не получится.

#!/usr/bin/perl
use strict;
use warnings;
use File::Find;

my @importlog;
my @errorlog;
find(sub {
    push @importlog, $File::Find::name if /^import-log\.*/;
    push @errorlog, $File::Find::name if /^error-log\.*/;
}, '.');

print "Import log:\n", join("\n", @importlog), "\n";
print "Error log:\n", join("\n", @errorlog), "\n";
2 голосов
/ 22 апреля 2011

Создайте новый обработчик предупреждений, затем сделайте что-нибудь с сообщением, сохраните его, проигнорируйте его и т. Д. *

local $SIG{__WARN__} = sub {
  my $message = shift;

  ## do nothing to ignore all together

  ## ignore specific message
  # warn $message unless $message =~ /No such file or directory/;

  ## or do something else
  # die $message ## make fatal
  # open my $fh, '>', 'file.log'; print $fh $message;
};
1 голос
/ 25 февраля 2011

Вы можете перенаправить stderr на /dev/null как:

@importlog = `ls -al import-log.* 2> /dev/null`;

@errorlog = `ls -al error-log.* 2> /dev/null`;
0 голосов
/ 25 февраля 2011

Подоболочки наследуют STDERR родителя, поэтому, если вы хотите сделать это на глобальном уровне, вы можете сделать это:

open(STDERR,'>/dev/null');
`ls non-existent-file`;
`ls non-existent-file2`;
`ls non-existent-file3`;
`ls non-existent-file4`;
`ls non-existent-file5`;
...