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

execde una manera especial que puede explicarse de manera mucho más simple, escribiré una respuesta.Respuestas:
man bashdice:Las dos últimas líneas son lo importante: si se ejecuta
execsolo, sin un comando, simplemente hará que las redirecciones se apliquen al shell actual. Probablemente sepa que cuando ejecutacommand > file, la salida decommandse escribe enfilelugar de en su terminal (esto se llama redirección ). Si ejecuta en suexec > filelugar, la redirección se aplica a todo el shell: cualquier salida producida por el shell se escribe enfilelugar de a su terminal. Por ejemplo aquiPrimero comienzo un nuevo
bashshell. Luego, en este nuevo shell ejecutoexec > file, de modo que toda la salida se redirige afile. De hecho, después de eso ejecutodatepero 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 defilehecho contiene el resultado deldatecomando que ejecuté anteriormente.fuente
execsirve 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: primeroexecejemplo similar alnginxejemplo dado por @LukeGriffiths es el~/.vnc/xstartupscript que sevncserverutiliza para configurar un proceso de servidor VNC y luegoexec gnome-sessionoexec startkdemás.execuna 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.execsolo una forma deshsalir de esta cadena de comando y hacer que el demonio sea el proceso principal del contenedor.execes 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
execintenta 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
execaparece en un script, las instrucciones que siguen a la llamada ejecutiva nunca se ejecutarán (a menos que seexecencuentren en una subshell).execnunca regresa Tampoco se activarán trampas de shell como "EXIT".Si no se pasa ningún argumento,
execsolo 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. Elcatcomando 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/fdtenga 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/$$/fdnuevamente) 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.)execla 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 .
execse utiliza.execreemplazará el contenido del proceso actualmente en ejecución con la información de un programa binario.fuente
execpuede redirigir una salida de script, como en el enlace que publiqué?En
bash, si lo haceshelp exec:El bit relevante:
execes un shell integrado , que es el equivalente de shell de laexecfamilia 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