exec es un comando interno de la shell que fuerza a que un binario se ejecute sobre el propio proceso de la shell en vez de sobre un hijo.
Cuando en shell-script se invoca un comando, normalmente se crea un proceso hijo que lo ejecute. Esto a nivel de llamadas al sistema sería el típico:
if( (pid=fork()) == 0) { exec(command); exit(); } wait();
En general ésto es lo que queremos, para poder seguir ejecutando comandos en la shell. Sin embargo puede haber situaciones en las que no, casos típicos:
- tenemos un programa que va a monitorizar la ejecución de otro, y si hay un proceso shell por en medio no funciona bien, pero necesitamos esa shell para lo que sea (p.ej. preparar variables de entorno, ejecutar el comando con nice, etc.)
- lanzamos un programa vía un shell-script en MacOS y en el dock salen dos iconos
Con exec en lugar de hacer un fork que ejecute el comando, se ejecuta directamente sobre el proceso actual. Importante darse cuenta que, por lo tanto, cualquier comando que hubiera detrás del exec en la shell nunca se llega a ejecutar, pues el comando digamos que “suplanta” a la shell.
#!/bin/sh #inicializar variables, parsear parámetros, etc. export IP=$1 exec nice comando $*
Pues no lo pillo bien, me encontraba la semana pasada necesitando usar algo de exec y fork en perl, pero no lo pillo…
P.D: Felicidades por el blog.
saludos
Probablemente no tenga nada que ver, lo que comento aquí es shell-script de línea de comandos (bash para entendernos) y lo que comentaba de llamadas al sistema C. Supongo que en perl será más similar al C que al bash pero nunca me ha hecho falta meterme a ese nivel en perl.