shell - resueltos - scripts bash ejemplos
¿Cuáles son los usos del comando exec en los scripts de shell? (2)
¿Puede alguien explicar cuáles son los usos del comando exec en shell scripting con ejemplos simples?
Solo para aumentar la respuesta aceptada con una breve respuesta breve para los principiantes, probablemente no necesite un exec
.
Si todavía estás aquí, la siguiente discusión debería revelar por qué. Cuando corres diga,
sh -c ''command''
ejecuta una instancia sh
, luego inicia el command
como hijo de esa instancia sh
. Cuando el command
termina, la instancia sh
también termina.
sh -c ''exec command''
ejecuta una instancia sh
, luego reemplaza esa instancia sh
con el command
binario y ejecuta esa instancia 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 otro modo, configure el entorno como una 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 para 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 ejecutarla como un proceso secundario y esperar, luego salir tan pronto como sea posible. como se acaba
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 exec
ese comando como una optimización.
Si algo te obliga a ejecutar sh
pero realmente querías ejecutar otra cosa, exec something else
es, por supuesto, una solución para reemplazar la instancia sh
indeseada (como por ejemplo, si realmente quisieras ejecutar tu propio Sposhy gosh
lugar de sh
pero el tuyo no está). 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 aparte. La respuesta aceptada cubre eso muy bien; para mantener este contenido autónomo, simplemente cederé al manual para cualquier cosa donde exec
seguido de una redirección en lugar de un nombre de comando.
El comando incorporado exec
refleja las funciones en el kernel, hay una familia de ellas basadas en execve
, que generalmente se llama desde C.
exec
reemplaza el programa actual en el proceso actual, sin fork
un nuevo proceso. No es algo que usarías en cada guión que escribas, pero en ocasiones es útil. Aquí hay algunos escenarios que lo he usado;
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 queremos que se use la configuración del entorno de los archivos de inicio. Entonces, en (decir)
.profile
, la última afirmación dice algo como:exec appln-program
así que ahora no hay una concha para volver. Incluso si
appln-program
falla, el usuario final no puede acceder a un shell, porque no está allí, elexec
reemplazó.Queremos usar 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. Un sitio que conozco hizo que todos comenzaran con
csh
, y todos pusieron en su.login
(csh start-up file) una llamada aksh
. Mientras eso funcionó, dejó un procesocsh
perdido, y el cierre de sesión fue de dos etapas, lo que podría resultar confuso. Así que lo cambiamos aexec ksh
que acaba de reemplazar el programa c-shell con korn shell, y simplificamos todo (hay otros problemas con esto, como el hecho de queksh
no es un shell de inicio de sesión).Solo para guardar procesos. Si llamamos
prog1 -> prog2 -> prog3 -> prog4
etc. y nunca regresamos, entonces haga que cada llamada sea un exec. Ahorra recursos (no mucho, es cierto, a menos que se repita) y simplifica el cierre.
Obviamente, ha visto a un exec
utilizado en alguna parte, tal vez si mostró el código que lo está molestando podríamos justificar su uso.
Edit : Me di cuenta de que mi respuesta anterior es 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 espacio 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 formas de usarlas, en ksh use read -u
o print -u
, en bash
, por ejemplo:
read <&3
echo stuff >&4