Tengo esto en un script bash:
exit 3;
exit_code="$?"
if [[ "$exit_code" != "0" ]]; then
echo -e "${r2g_magenta}Your r2g process is exiting with code $exit_code.${r2g_no_color}";
exit "$exit_code";
fi
Parece que saldrá justo después del comando de salida, lo cual tiene sentido. Me preguntaba si hay algún comando simple que pueda proporcionar un código de salida sin salir de inmediato.
Iba a adivinar:
exec exit 3
pero da un mensaje de error: exec: exit: not found
. ¿Que puedo hacer? :)
bash
shell-script
exec
exit
exit-status
G-Man dice 'restablecer a Mónica'
fuente
fuente
exec exit 3
no es bueno, obtengo"exec: exit: not found"
exit_code=3
y eliminar laexit 3
línea por completo?$?
variable pero no salga de este script"?Respuestas:
Si tiene un script que ejecuta algún programa y mira el estado de salida del programa (con
$?
), y desea probar ese script haciendo algo que haga$?
que se establezca en algún valor conocido (por ejemplo,3
), simplemente hagaLos paréntesis crean un sub-shell. Luego, el
exit
comando hace que ese sub-shell salga con el estado de salida especificado.fuente
exit_code="3"
para pruebasexit
es un bash incorporado, por lo que no puedesexec
hacerlo. Por manual de bash :Al unir todo esto, diría que su única opción es almacenar el estado de salida deseado en una variable y luego,
exit $MY_EXIT_STATUS
cuando sea apropiado.fuente
$?
(aunque no estoy realmente seguro de por qué lo haría), eso parece una respuesta sólida. Si solo desea establecerlo en algún valor fallido,false
es otra opción.Puede escribir una función que devuelva el estado dado como argumento, o
255
si no se da ninguno. (Lo llamo porqueret
"devuelve" su valor).y use
ret
en lugar de su llamada aexit
. Esto evita la ineficiencia de crear el sub-shell en la respuesta actualmente aceptada.Algunas medidas
en mi máquina tarda unos 3,5 segundos.
en mi máquina toma aproximadamente 0.051 segundos, 70 veces más rápido. Poner el manejo predeterminado todavía lo deja 60 veces más rápido. Obviamente, el bucle tiene algo de sobrecarga. Si cambio el cuerpo del bucle a solo ser
:
otrue
el tiempo se reduce a la mitad a 0.025, un bucle completamente vacío es una sintaxis no válida. Agregar;:
al bucle muestra que este comando mínimo tarda 0.007 segundos, por lo que la sobrecarga del bucle es de aproximadamente 0.018. Restar esta sobrecarga de las dos pruebas muestra que laret
solución es más de 100 veces más rápida.Obviamente esta es una medida sintética, pero las cosas se suman. Si hace que todo sea 100 veces más lento de lo necesario, terminará con sistemas lentos. 0.0
fuente
Acerca de
exec exit 3
... intentaría ejecutar un comando externo llamadoexit
, pero no hay ninguno, por lo que obtiene el error. Tiene que ser un comando externo en lugar de uno integrado en el shell, ya queexec
reemplaza el shell por completo. Lo que también significa que incluso si tuviera un comando externo llamadoexit
,exec exit 3
no volvería a continuar su script de shell, ya que el shell ya no estaría allí .fuente
exec bash -c "exit 3"
, pero por el momento no se me ocurre ninguna razón para hacerlo en lugar de soloexit 3
.exec
'ing' oexit
'' solo detendrá el script, que no parecía lo que la pregunta quería.Puedes hacer esto con Awk:
O sed:
fuente
sh -c 'exit 9'
(exit 9)
en la respuesta aceptada