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

Resuelto user2400564 asked hace 11 años • 2 respuestas

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

user2400564 avatar Aug 21 '13 14:08 user2400564
Aceptado

El execcomando incorporado refleja funciones en el kernel, hay una familia de ellos basada en execve, que generalmente se llama desde C.

execreemplaza el programa actual en el proceso actual, sin forkiniciar un nuevo proceso. No es algo que usarías en cada guión que escribas, pero resulta útil en ocasiones. Aquí hay algunos escenarios en los que lo he usado;

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

     exec appln-program
    

    así que ahora no hay ningún caparazón al que volver. Incluso si appln-programfalla, el usuario final no puede acceder a un shell porque no está allí: lo execreemplazó.

  2. Queremos utilizar un shell diferente al de /etc/passwd. Por estúpido que parezca, algunos sitios no permiten a los usuarios modificar su shell de inicio de sesión. En un sitio que conozco, todos comenzaron con csh, y todos simplemente pusieron en su .login(archivo de inicio de csh) una llamada a ksh. Si bien eso funcionó, dejó un cshproceso perdido en ejecución y el cierre de sesión fue de dos etapas, lo que podría resultar confuso. Así que lo cambiamos a exec kshlo que simplemente reemplazó el programa c-shell con el shell korn, y simplificamos todo (hay otros problemas con esto, como el hecho de que kshno es un shell de inicio de sesión).

  3. Sólo para guardar procesos. Si llamamos prog1 -> prog2 -> prog3 -> prog4, etc. y nunca volvemos, entonces haga que cada llamada sea un ejecutivo. Ahorra recursos (no mucho, hay que reconocerlo, a menos que se repita) y simplifica el apagado.

Obviamente lo has visto execusado en alguna parte, tal vez si mostraras 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 execin shells como kshy bash- usado 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, execvuelve al significado original:

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

Hay varias formas de utilizarlos, en ksh use read -uo print -uen bash, por ejemplo:

read <&3
echo stuff >&4
cdarke avatar Aug 21 '2013 07:08 cdarke

Solo para aumentar la respuesta aceptada con una respuesta breve y breve para principiantes, probablemente no necesite exec.

Si todavía estás aquí, es de esperar que la siguiente discusión revele por qué. Cuando corres, di,

sh -c 'command'

ejecuta una shinstancia y luego comienza commandcomo hijo de esa shinstancia. Cuando commandfinaliza, la shinstancia también finaliza.

sh -c 'exec command'

ejecuta una shinstancia, luego reemplaza esa shinstancia con el commandbinario y lo ejecuta en su lugar.

Por supuesto, ambas cosas 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 otra manera configure el entorno como preparación para la ejecución command. Ésta es prácticamente la única situación en la que exec commandresulta útil.

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

Esto hace algunas cosas para preparar el entorno para que contenga lo que se necesita. Una vez hecho esto, la shinstancia ya no es necesaria, por lo que es una optimización (menor) simplemente reemplazar la shinstancia con el commandproceso, en lugar de shejecutarlo como un proceso hijo y esperarlo, luego salir tan pronto como finalice.

De manera similar, si desea liberar tantos recursos como sea posible para un comando pesado al final de un script de shell, es posible que desee utilizar execese comando como optimización.

Si algo te obliga a ejecutar shpero realmente deseas ejecutar otra cosa, exec something elseexiste, por supuesto, una solución alternativa para reemplazar la shinstancia no deseada (como, por ejemplo, si realmente deseas ejecutar tu propio spiffy goshen lugar de shpero el tuyo no aparece en la lista, /etc/shellspor lo que puedes No lo especificas como tu shell de inicio de sesión).

El segundo uso de execpara manipular descriptores de archivos es un tema aparte. La respuesta aceptada lo cubre muy bien; Para mantener esto autónomo, simplemente consultaré el manual para cualquier cosa que execvaya seguida de una redirección en lugar de un nombre de comando.

tripleee avatar Jul 26 '2016 05:07 tripleee