¿La ejecución exec echo "some "; echo "test"
en bash nunca imprime "alguna prueba"?
Solicitaría confirmación a esta pregunta, ya que estoy escribiendo un pequeño script de shell y me gustaría que no continúe con nada después de que exec
se haya llamado el comando.
Creo que no tendría que preocuparme, según tengo entendido, después de consultar:
man 3 exec
man 1p exec
Los scripts de shell, cuando son ejecutados por el shell, harán
- el shell ejecuta el programa
exec
, que - utiliza las
exec***
llamadas al sistema familiar que reemplazan el shell/bash que ha estado ejecutando el script, por esteimpediracciones adicionales del caparazón (que fue "reemplazado")
Como se indicó anteriormente, el objetivo principal de esta pregunta es buscar confirmación de mi razonamiento para evitar que echo test
se ejecute cualquier cosa en el script que ocurra después del ejecutable (como ).
Agradecería una respuesta general (POSIX), en la medida de lo posible, pero por si hay particularidades lo que más me interesa es GNU/Linux y GNU/Bash.
Respuesta1
Bien, si exec
tiene éxito, reemplaza el shell actual, por lo que los siguientes comandos no se ejecutan.
Sin embargo,al menos en Bash, el shell también sale si elexec
falla:
exec [-cl] [-a name] [command [arguments]]
SidominioSe suministra, reemplaza el shell sin crear un nuevo proceso. [...] Sidominiono se puede ejecutar por algún motivo, se cierra un shell no interactivo, a menos que la
execfail
opción shell esté habilitada. En ese caso, devuelve fracaso.
Entonces, incluso algo así bash -c 'exec /bin/nosuchfile; echo foo'
simplemente imprimirá un mensaje de error sobre el archivo de programa que falta. Para manejar el error en el script, necesitarías algo como
#!/bin/bash
shopt -s execfail
exec /someprogram
echo whoops, it failed
Pero aún recibe el mensaje de error de exec
. Si pones una redirección en exec
,sigue vigentesi el script continúa después del exec
error.
Respuesta2
El exec
incorporado (con un argumento de comando¹) reemplaza el proceso de shell². No se ejecuta ningún código posterior en el proceso de shell.
Por lo tanto, la única forma exec echo "some "; echo "test"
de imprimir some text
es si hubiera un comando ejecutable llamado echo
en la RUTA, y este ejecutable se imprimiera some text
en lugar de some
. No puede suceder en circunstancias normales en las que el echo
ejecutable se comporta como se esperaría de un comando llamado echo
.
Si no hay ningún archivo ejecutable llamado echo
en la RUTA o la ejecución falla, exec
se mostrará un mensaje de error y se saldrá del shell. Incluso en ese caso, echo "test"
no se ejecuta.
¹ sin un argumento de comando es una bestia diferente. No reemplaza el proceso de shell, solo aplica redirecciones.
² En un subshell, solo el subshell se ve afectado, el shell principal sigue ejecutándose normalmente. exec
Respuesta3
exec
siempre termina el guiónsiejecuta un comando y lo hace correctamente (no relacionado con el código de salida del comando sino con su inicio).
exec
se puede ejecutar sin un comando de una manera muy útil: Para redirigir permanentemente los descriptores de archivos:
exec 3>/path/to/file
Si el comando no se puede iniciar, el comportamiento del shell depende de la configuración. bash
sale de forma predeterminada.
Quizás sea mejor que utilices una función en su lugar:
safe_exec () {
cmd="$1"
if test -z "$cmd" || ! test -f "$cmd" || ! test -x "$cmd"; then
exit 1
else
exec "$@"
fi
}
safe_exec echo "some "; echo "test"