¿La ejecución de "exec echo some; echo test" en bash nunca imprime "alguna prueba"?

¿La ejecución de "exec echo some; echo test" en bash nunca imprime "alguna prueba"?

¿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 execse 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

  1. el shell ejecuta el programa exec, que
  2. 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 testse 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 exectiene é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 execfailopció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 execerror.

Respuesta2

El execincorporado (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 textes si hubiera un comando ejecutable llamado echoen la RUTA, y este ejecutable se imprimiera some texten lugar de some. No puede suceder en circunstancias normales en las que el echoejecutable se comporta como se esperaría de un comando llamado echo.

Si no hay ningún archivo ejecutable llamado echoen la RUTA o la ejecución falla, execse 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

execsiempre termina el guiónsiejecuta un comando y lo hace correctamente (no relacionado con el código de salida del comando sino con su inicio).

execse 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. bashsale 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"

información relacionada