[P] Redireccionar salida de comandos

Ernesto Hernandez-Novich emhn at telcel.net.ve
Mon Mar 17 07:38:43 CST 2003


On Mon, 17 Mar 2003, Francisco Obispo wrote:
> ahora para responder tu pregunta utiliza:
>
> open(ERRORLOG,">/dev/null");
> *STDERR=*ERRORLOG;
>
> recuerda cerrar el filehandle al final del programa..
>
> close(ERRORLOG);
>
>
> de esta forma todo lo que se genere al STDERR va a ser enviado a /dev/null..

Esto no reconecta el STDERR a /dev/null, sino que altera el espacio de
nombres para "simular" la reconexión, pero _solamente_ el del script Perl,
En una reconexión "verdadera" ocurriría la siguiente secuencia de
llamadas al sistema

close(2)           ; Cierra 2, correspondiente al stderr
open(/dev/null)    ; Abre /dev/null en el _primer_ descriptor libre, que
                   ; es 2 en virtud de haber sido cerrado inmediatamente
		   ; antes y en consecuencia, /dev/null se convierte en
		   ; el nuevo stderr. Esto es exactamente lo mismo que
		   ; pasa cuando uno hace 2> /dev/null en el shell.

y sería "heredado" por los procesos hijos. El método que propone
Francisco no cierra el descriptor 2, sino que abre uno nuevo con el open
y luego hace una alteración en la tabla de símbolos de Perl, de manera
que el _símbolo_ STDERR apunte a la misma información que el símbolo
_ERRORLOG_; el efecto en el programa Perl es que la salida va a parar a
otra parte diferente al STDERR tradicional, pero por un "alias" en la
tabla de símbolos y no por una redirección formal como se acostumbra en
Unix.

Por eso es que ese método no "reconecta" el STDERR de procesos hijo
invocados vía system/open. Puedes verificarlo con

$ perl
open E, ">/dev/null";
*STDERR = *E;
open F,"| ls estosisale"; # Suponiendo que el archivo 'estosisale' no existe
print STDERR "Esto no sale";
close E;
close F;
^D
ls: estosisale: No such file or directory

Que es lo que Luis quiere que no pase. Tiene que usar la redirección del
shell o bien hacer su par fork/exec manualmente.
-- 
Ernesto Hernández-Novich - Running Linux 2.4.19 i686 - Unix: Live free or die!
Geek by nature, Linux by choice, Debian of course.
If you can't apt-get it, it isn't useful or doesn't exist.
GPG Key Fingerprint = 438C 49A2 A8C7 E7D7 1500 C507 96D6 A3D6 2F4C 85E3

------------------------------------------------------------------------
Enviar e-mail a <majordomo at pm.org> colocando en el cuerpo:
"UNSUBSCRIBE caracas-pm-list" para desuscribirse.
"INFO caracas-pm-list" para conocer las reglas de etiqueta.
------------------------------------------------------------------------



More information about the caracas-pm mailing list