[perl] Ejecutar shell en perl (o como borrar archivos).
Bolo Lacertus
lacertus@servidor.unam.mx
Tue, 01 Dec 1998 10:58:43 -0600
Saludos!!!
Ok, una de las principales fortalezas de Perl es interactuar bastante
bien con los recursos del sistema, y eso incluye a Shell, sin embargo,
por lo regular es mejor tener todo tu código en un solo lenguaje y
siendo que todo lo que puedes hacer con shell lo puedes hacer con Perl
es algo que debes considerar el reescribir tu programa en Perl para que
sea un poco mas sencillo en el sistema como un todo.
Por ejemplo (para matar dos pájaros de un tiro)
Para borrar un archivo se me ocurren las siguientes opciones:
$archivo="<poga aqui la ruta del archivo a borrar>";
#Inicio de alternativas, con system
system("rm $arhivo");
#con exec, el lo último que hacemos
exec("rm $archivo");
#con ``
`rm $archivo`;
#con open (duh!)
open(AN,"rm $archivo");
close(AN); #(no nos importa su salida estandar)
#O como debe ser, con una función de Perl
unlink $archivo;
Ma Enriqueta Barilla Perez wrote:
> Alguien sabe como puedo ejecutar un shell script de unix desde un programa
> en perl? Se los agradeceria terriblemente.
Ok, despues de la moralina, las formas, hay cuatro principalmente, que
son las mismas que para ejecutar cualquier otro programa de UNIX desde
Perl (Paul Terukina ?estas leyendo?) estas son:
system()
exec()
open()
``
Ok, ahora como usarlas y cuando usarlas:
system(<comando>);
Este es el favorito de las multitudes, te permite ejecutar un comando (o
script de shell) y pasarle todos los parametros que quieras, sin
embargo, no captura ni su salida estandar ni su entrada estandar y tu
programa en Perl espera hasta que termine (si no termina tu programa en
Perl esperará por siempre, a menos de que hagas magia pesada con señales
que no viene al caso, simplmente asegurate de que tu programa termine).
<comando> Es una expresión que te permite especificar lo que debe
hacerse de modo similar a como lo harías en el prompt de shell, si usas
"" puedes usar variables y todo lo demas.
System debe usarse cuando deseas que un comando (que ya sabes que
resultado tendrá) se ejecute cuando toda la información que necesitas
pasarle será en forma de parametros y no te interesa lo que escribe a su
salida estandard. Además, deseas que tu programa en Perl continue
corriendo DESPUES de ejecutar el comando.
exec(<comando>)
Con este también ejecutas un comando, pero nunca regresa el control a tu
programa, de hecho, con exec terminas tu programa para inciar, en su
lugar, a otro (la peudes pasar todos los parámetros que quieras). Como
se deduce, tampoco puedes enviar nada a su entrada o recoger nada de su
salida estandar.
exec se usa sobretodo cuando deseas que tu programa en Perl prepare el
camino para un comando o programa escrito en otro lenguaje, me ha
llegado a pasar con un par de clientes de bases de datos y aplicaciones
que requieren mucha configuración del ambiente en función de las tareas
a realizar.
open(<handle>,<comando>)
Como sabrás, open se suele usar para abrir archivos ya sea para lectura
o escritura, pero tembién se puede usar para ejecutar un comando y
capturar ya sea su salida estandar o su entrada estandar.
<handle> Es un identificador para tener tu file handle.
<comando> Es el comando UNIX a ejecutar y todos sus parametros, además,
si deseas capturar su entrada estandar debes anteponer un pipe "|"
mientras que si deseas capturar su salida estandar debes terminar el
comando con pipe "|". No puedes capturar a la vez la entrada y la salida
estandar.
Cuando ejecutas el comando con open, debes capturar toda la salida
estandard o alimentar su entrada estandard hasta que termine, una vez
hecho esto, debes ejecutar close <handle>, es ese momento Perl ignora el
resto de la salida estandar del archivo o manda un ^D a su entrada
estandar y espera a que termine el comando para regresar control a tu
script.
Open, como te imaginarás, se usa para ejecutar comandos o programas a
los que deseas pasar o recivir información de su entrada o salida
estandard. En las ocaciónes en que uno tiene que usar programas
interactivos lo unico que se puede hacer es redireccionar, por ejemplo,
su entrada estandar a un archivo que escribamos para el caso con
anterioridad (de modo que el comando se convierte en algo como "temp >
comando par1 par2") y capturamos su salida estandar para ver los
resultados que nuestras instrucciones prehechas tienen (el comando final
para el open será "temp > comando par1 par2 |").
Por último.
$algo=`<comando>`;
Al ejecutar un comando con `` se hace el equivalente a un open, pero
solo se captura la salida estandar del comando y se regresa completa
como valor de evaluar la expresión. En el ejemplo, $algo tendrá todo lo
que el comando <comando> haya escrito a su salida estandar.
Se usa esta forma de ejecución cuando no se desea generar mucho código
por la ejecución de programas sencillos de SO y se desea capturar sus
resultados.
NOTA SOBRE LA SALIDA ESTANDAR.
Muchos programas (escritos en C) no mandan todos sus resultados (que
aparecen en consola) a salida estandar, de hecho, por defecto, C manda
los mensajes escritos con printf hacia la salida de consola (que es por
default la salida estandar, pero no es tal) de mdo que si se trata de
capturar el resultado redireccionando la salida estandar descubrimos que
no se obtienen esos mensajes ya que el programa específicamente los
escribe a la salida de consola (que los desecha si no tiene un handle
adecuado). Un comando que puede usarse como ejemplo es date, que manda
su saldia a consola por lo que no puede capturarse con Perl (sin embargo
puede ejecutarse de modo que escriba sus resultados a un archivo que
despues Perl pueda revisar), sin embargo, es major usar las rutinas
internas de Perl para control de fechas por lo que simplemente no se
recomienda usar date de UNIX.
En general, no se recomienda la ejecución automática de scripts o
programas hechos para ser interactivos (hacia un susuario humano) en
parte por que Perl solo puede trabajar en un instante determinado la
entrada o la salida del programa y porque en su propio concepto, no es
buena idea ejecutar de modo automático lo diseñado para uso humano (ni
viceversa).
Sale!, espero no haber hechado demaciado rollo, como siempre te
recomiendo que leas la referencia de Perl (particularmente PerlFunc y
PerlSint) para que puedas ver la descripción completa de los comandos y
solo la supersimplificada descripción que yo doy de ellos.
Porque hay mas de una forma de hacerlo: Daniel Sol
--
Bolo Lacertus: lacertus@servidor.dgsca.unam.mx ==~\___\
http://132.248.71.81/cgi-bin/lacertus/hola =__vvvv
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCM/GCS/GE/GED d?>d+ s:+ a-->- C++>+++$ US/UI++ P++++$ L+ E- W+++ N o?
K-
w--- !O !M V-- PS++ PE-- Y+ PGP+ t+ 5? X- R* tv-- b++>+++ DI+++ D+ G+
e+>++
h* r++(*) y+
------END GEEK CODE BLOCK------
--------- Pie de mensaje --------------------------------
Visite: http://tlali.iztacala.unam.mx/~randrade/perl.shtml
Cancelar inscripcion:
mail to: majordomo@tlali.iztacala.unam.mx
text : cancelacion perl