No entiendo el comando bash exec
. He visto que se usa dentro de los scripts para redirigir toda la salida a un archivo (como se ve en esto ). Pero no entiendo cómo funciona o qué hace en general. He leído las páginas de manual pero no las entiendo.
107
exec
de una manera especial que puede explicarse de manera mucho más simple, escribiré una respuesta.Respuestas:
man bash
dice:Las dos últimas líneas son lo importante: si se ejecuta
exec
solo, sin un comando, simplemente hará que las redirecciones se apliquen al shell actual. Probablemente sepa que cuando ejecutacommand > file
, la salida decommand
se escribe enfile
lugar de en su terminal (esto se llama redirección ). Si ejecuta en suexec > file
lugar, la redirección se aplica a todo el shell: cualquier salida producida por el shell se escribe enfile
lugar de a su terminal. Por ejemplo aquiPrimero comienzo un nuevo
bash
shell. Luego, en este nuevo shell ejecutoexec > file
, de modo que toda la salida se redirige afile
. De hecho, después de eso ejecutodate
pero no obtengo salida, porque la salida se redirige afile
. Luego salgo de mi shell (para que la redirección ya no se aplique) y veo que defile
hecho contiene el resultado deldate
comando que ejecuté anteriormente.fuente
exec
sirve para reemplazar también el proceso actual de la shell con un comando, de modo que el padre sigue un camino y el hijo posee pid. Esto no es solo para la redirección. Agregue esta informaciónexec nginx <various nginx arguments>
. Esto significa que nginx asume el pid del script bash y ahora nginx es el principal proceso de ejecución del contenedor, no el script. Supongo que esto es solo por limpieza, a menos que alguien más sepa una razón más concreta para ello.gnome-terminal
, que al menos en 14.04 tenía un script de contenedor para configurar argumentos. Y ese es su único propósito, realmente: establecer artes y medio ambiente. Otro caso sería la limpieza: primeroexec
ejemplo similar alnginx
ejemplo dado por @LukeGriffiths es el~/.vnc/xstartup
script que sevncserver
utiliza para configurar un proceso de servidor VNC y luegoexec gnome-session
oexec startkde
más.exec
una secuencia de comandos de inicio del contenedor es que el PID 1, el ENTRYPOINT del contenedor, tiene un significado especial en Docker. Es un proceso principal que recibe señales, y cuando existe, el contenedor también sale.exec
solo una forma desh
salir de esta cadena de comando y hacer que el demonio sea el proceso principal del contenedor.exec
es un comando con dos comportamientos muy distintos, dependiendo de si se usa al menos un argumento o no se usa ningún argumento.Si se pasa al menos un argumento, el primero se toma como un nombre de comando e
exec
intenta ejecutarlo como un comando que pasa los argumentos restantes, si los hay, a ese comando y administra las redirecciones, si las hay.Si el comando pasado como primer argumento no existe, el shell actual, no solo el comando exec, sale por error.
Si el comando existe y es ejecutable, reemplaza el shell actual. Eso significa que si
exec
aparece en un script, las instrucciones que siguen a la llamada ejecutiva nunca se ejecutarán (a menos que seexec
encuentren en una subshell).exec
nunca regresa Tampoco se activarán trampas de shell como "EXIT".Si no se pasa ningún argumento,
exec
solo se usa para redefinir los descriptores actuales del archivo shell. El shell continúa después delexec
, a diferencia del caso anterior, pero la entrada estándar, la salida, el error o cualquier descriptor de archivo que se haya redirigido surten efecto.Si se usa alguna de las redirecciones
/dev/null
, cualquier entrada de ella devolverá EOF y cualquier salida se descartará.Puede cerrar los descriptores de archivos utilizando
-
como origen o destino, por ejemploexec <&-
. Las siguientes lecturas o escrituras fallarán.Aquí hay dos ejemplos:
Este script generará "foo" como el comando cat, en lugar de esperar la entrada del usuario como lo hubiera hecho en el caso habitual tomará su entrada del archivo / tmp / bar que contiene foo.
Este script se mostrará
4
(el número de bytes en / tmp / bar) y finalizará inmediatamente. Elcat
comando no se ejecutará.fuente
/dev/null
, por lo que las escrituras siguen teniendo éxito y las lecturas devuelven EOF.close(2)
en un fd provocaría que las llamadas al sistema de lectura / escritura devolvieran errores, y eso se hace con,exec 2>&-
por ejemplo.exec 3</dev/null;
ls -l /proc/self/fd
tenga en cuenta que fd 3 estará abierto de solo lectura en / dev / null. Luego ciérrelo nuevamente conexec 3<&-
, y podrá ver (conls -l /proc/$$/fd
nuevamente) que su proceso de shell ya no tiene fd 3. (cerrar stdin conexec <&-
puede ser útil en scripts, pero interactivamente es un cierre de sesión.)exec
la respuesta más votada actual solo hablan sobre un caso de uso y la otra respuesta de g_p solo habla sobre el otro caso de uso. Y esta respuesta es agradable y concisa / legible para un tema tan complejo.Para entender
exec
, primero debes entenderfork
. Estoy tratando de mantenerlo corto.Cuando llegas a una bifurcación en el camino, generalmente tienes dos opciones. Los programas de Linux llegan a esta bifurcación cuando llegan a una
fork()
llamada del sistema.Los programas normales son comandos del sistema que existen en forma compilada en su sistema. Cuando se ejecuta dicho programa, se crea un nuevo proceso. Este proceso secundario tiene el mismo entorno que su padre, solo el número de ID del proceso es diferente. Este procedimiento se llama bifurcación .
exec
se utiliza.exec
reemplazará el contenido del proceso actualmente en ejecución con la información de un programa binario.fuente
exec
puede redirigir una salida de script, como en el enlace que publiqué?En
bash
, si lo haceshelp exec
:El bit relevante:
exec
es un shell integrado , que es el equivalente de shell de laexec
familia de llamadas al sistema de las que habla G_P (y cuyas páginas de manual parece haber leído). Simplemente tiene la funcionalidad obligatoria POSIX de afectar el shell actual si no se especifica ningún comando.fuente