[perl] Llamar a otros scripts

Salvador Ortiz Garcia sog@msg.com.mx
Mon, 5 Apr 1999 22:51:13 -0500 (CDT)


On Mon, 5 Apr 1999, Adrian Galindo wrote:

> 
> Hola lista, que tal la semanita? (para lo que descansaron)
> 
> Hay alguna forma de verificar que dicho programa se ejecute solo si fue
> llamado por otro??? y por ende que no se pueda ejecutar por si solo.

Si, se me ocurren varias, todas de perl avanzado ;-)

Pero vamos a tu caso, para ver si entendí bien:

Tienes tres programas en perl, en uno.pl invocas a dos.pl y a tres.pl 
con argumentos, en su caso, mediante algo como:

...
system("/path/dos.pl $arg1 $arg2 ...");
... # algunas instrucciones
system("/path/tres.pl $param1 $param2 ...");
...

y quieres que dos.pl y tres.pl chequen que efectivamente fueron invocados
por uno.pl, correto?

Si no, reexplicame, si si, sigue leyendo.

En uno.pl tienes que usar una sintaxis especial del 'system' al invocar a
cada subprograma, por ejemplo para ejecutar dos.pl usa:

...
system {'/usr/bin/perl'}   '(){};|', '/path/dos.pl', $arg1, $arg2, ....
#Nota sin coma aquí------^
...

Y en dos.pl chechas que estás siendo invocado por uno.pl:

...
die "A $0 no se le puede invocar así, adios!\n" unless($^X eq '(){};|');
# Resto de tu programa
...

El truco consiste en hacerle creer al interprete de perl que se llama
'(){};|', un nombre imposible (entre otros) para un programa común, pues
usa puros caracteres especiales para el shell.

Adicionalmente a dos.pl le puedes quitar tranquilamente los permisos de
ejecución, pues ya no los necesita y evitas la tentación.  ;-)

Ademas si a tres.pl no necesitas esperarlo en uno.pl puedes usar 'exec'
en lugar de 'system', con la misma sintaxis.

Nota: Lo anterior puede no funcionar en Windows.

Saludos

Salvador Ortiz.

--------- Pie de mensaje --------------------------------
Visite: http://tlali.iztacala.unam.mx/~randrade/perl.shtml
Cancelar inscripcion:
mail to: majordomo@tlali.iztacala.unam.mx
text   : cancelacion perl