¿Cuáles son los usos del comando exec en scripts de shell?

¿Alguien puede explicar cuáles son los usos del comando exec en scripts de shell con ejemplos simples?

El comando integrado del ejecutor refleja funciones en el kernel, hay una familia de ellos basada en execve , que generalmente se llama desde C.

exec reemplaza el progtwig actual en el proceso actual, sin tener que fork por un nuevo proceso. No es algo que usarías en cada script que escribes, pero en ocasiones es útil. Aquí hay algunos escenarios que he usado;

  1. Queremos que el usuario ejecute un progtwig de aplicación específico sin acceso al shell. Podríamos cambiar el progtwig de inicio de sesión en / etc / passwd, pero tal vez queremos que la configuración del entorno se use desde los archivos de inicio. Entonces, en (digamos) .profile , la última statement dice algo así como:

      exec appln-program 

    así que ahora no hay un caparazón al que regresar. Incluso si appln-program falla, el usuario final no puede acceder a un shell, porque no está allí; el exec reemplazó.

  2. Queremos usar un shell diferente al de / etc / passwd. Por estúpido que parezca, algunos sitios no permiten a los usuarios alterar su shell de inicio de sesión. Un sitio que conozco hizo que todos comenzaran con csh , y todos simplemente pusieron en su .login (csh start-up file) una llamada a ksh . Si bien funcionó, dejó un proceso de csh perdida en funcionamiento, y el cierre de sesión fue en dos etapas, lo que podría confundir. Así que lo cambiamos a exec ksh que acaba de reemplazar el progtwig c-shell con el shell korn, y simplificamos todo (hay otros problemas con esto, como el hecho de que el ksh no es un shell de inicio de sesión).

  3. Solo para guardar procesos. Si llamamos a prog1 -> prog2 -> prog3 -> prog4 etc. y nunca regresamos, entonces hagamos que cada llamada sea un ejecutivo. Ahorra recursos (no mucho, desde luego, a menos que se repita) y hace que el cierre sea más simple.

Obviamente has visto que el exec usó en alguna parte, quizás si mostraste el código que te molesta, podríamos justificar su uso.

Editar : Me di cuenta de que mi respuesta anterior está incompleta. Hay dos usos de exec en shells como ksh y bash , utilizados para abrir descriptores de archivos. Aquí hay unos ejemplos:

 exec 3< thisfile # open "thisfile" for reading on file descriptor 3 exec 4> thatfile # open "thatfile" for writing on file descriptor 4 exec 8<> tother # open "tother" for reading and writing on fd 8 exec 6>> other # open "other" for appending on file descriptor 6 exec 5<&0 # copy read file descriptor 0 onto file descriptor 5 exec 7>&4 # copy write file descriptor 4 onto 7 exec 3<&- # close the read file descriptor 3 exec 6>&- # close the write file descriptor 6 

Tenga en cuenta que el espaciado es muy importante aquí. Si coloca un espacio entre el número fd y el símbolo de redirección, exec vuelve al significado original:

  exec 3 < thisfile # oops, overwrite the current program with command "3" 

Hay varias maneras de usarlos, en ksh use read -u o print -u , en bash , por ejemplo:

 read <&3 echo stuff >&4 

Solo para boost la respuesta aceptada con una breve respuesta breve para novatos, probablemente no necesite un exec .

Si todavía está aquí, la siguiente discusión debería revelar por qué. Cuando corres, por ejemplo,

 sh -c 'command' 

ejecuta una instancia sh , luego inicia el command como hijo de esa instancia sh . Cuando el command finaliza, la instancia sh también finaliza.

 sh -c 'exec command' 

ejecuta una instancia sh , luego reemplaza esa instancia sh con el command binario, y la ejecuta en su lugar.

Por supuesto, ambos son inútiles en este contexto limitado; simplemente quieres

 command 

Hay algunas situaciones marginales en las que desea que el shell lea su archivo de configuración o, de alguna manera, configure el entorno como preparación para ejecutar el command . Esta es prácticamente la única situación en la que el exec command es útil.

 #!/bin/sh ENVIRONMENT=$(some complex task) exec command 

Esto hace algunas cosas para preparar el entorno de modo que contenga lo que se necesita. Una vez hecho esto, la instancia sh ya no es necesaria, por lo que es una optimización (menor) simplemente reemplazar la instancia sh con el proceso de command , en lugar de tener que ejecutarla como un proceso secundario y esperarla, luego salir tan pronto como sea posible. cuando termina.

Del mismo modo, si desea liberar la mayor cantidad de recursos posible para un comando pesado al final de un script de shell, es posible que desee exec ese comando como una optimización.

Si algo te obliga a ejecutar sh pero realmente querías ejecutar otra cosa, el exec something else es, por supuesto, una solución para reemplazar la instancia sh no deseada (como por ejemplo si realmente querías ejecutar tu propio spiffy gosh lugar de sh pero tu isn No aparece en /etc/shells por lo que no puede especificarlo como su shell de inicio de sesión).

El segundo uso de exec para manipular descriptores de archivos es un tema separado. La respuesta aceptada lo cubre muy bien; para mantener este contenido independiente, me limitaré a consultar el manual de cualquier cosa donde el exec sea ​​seguido de un redireccionamiento en lugar de un nombre de comando.