2011-02-25 10 views
7

Estoy usando algunos comandos del sistema en Perl.¿Cómo puedo deshacerme del STDERR en Perl

En el caso de abajo que estaba recibiendo de salida de la siguiente manera:

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

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

No specified files found for deletion 

Mi código:

sub monthoryear() 
{ 

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

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

} 

Yo no quiero ver lo siguiente en la salida, incluso si hay no hay archivos

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

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

Respuesta

5

Puede añadir stderr redirección en sus comandos subshell:

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

lo si quiero capturar ese mensaje de error ??? – Sunny

+0

@Sunny - puede usar un archivo en lugar de/dev/null en ese caso, simplemente reemplace con/path/to/file – justkt

+0

¿puedo obtenerlo en una variable? – Sunny

1

puede redirigir la stderr a /dev/null como:

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

@errorlog = `ls -al error-log.* 2> /dev/null`; 
13

Mientras que las otras respuestas son correctas acerca de la exacta pregunta técnica que hizo, también debería considerar no escribir lo que efectivamente es un script de shell en Perl.

Debe utilizar Perl métodos nativos de conseguir lista de archivos (por ejemplo glob() o File::Find) en lugar de llamar a un backticked ls.

+1

Esta es en realidad la respuesta correcta.Hacerlo en Perl significa que puede capturar el resultado en una variable sin recurrir a redirigir STDERR, lo que podría provocar una acción espeluznante a distancia. – CanSpice

-1

subniveles heredarán STDERR de los padres, así que si quieres hacerlo a nivel global, se puede hacer esto:

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

Debe usar los tres argumentos abiertos y File :: Spec para obtener el dispositivo nulo: – shawnhcorey

4

Salida perlfaq8. Si no le importa si es STDOUT o STDERR, puede obtener ambos redirigidos a STDOUT.

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

En su caso, es probable que sólo quieren deshacerse de STDERR:

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

Sin embargo, estoy de acuerdo con DVK's answer. Usar un comando externo para obtener una lista de archivos parece tonto. Debe usar File::Find. De esta forma puede usar el manejo normal de errores de Perl en caso de que algo falle.

#!/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"; 
5

redirección STDERR al dispositivo nulo:

use File::Spec; 
open STDERR, '>', File::Spec->devnull() or die "could not open STDERR: $!\n"; 
2

Crear un gancho nuevo advertir, a continuación, hacer algo con el mensaje, almacenarlo, lo ignoran, etc ...

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; 
}; 
Cuestiones relacionadas