¿Cómo ejecutar el comando y, si falla, ejecutar otro comando y devolver 1?

¿Cómo ejecutar el comando y, si falla, ejecutar otro comando y devolver 1?

Estoy acostumbrado a este estilo en otros idiomas:

do_something || (log_error; return 1) # do something, and if that fails, log the error and then return 1 no matter what, even if the logging fails.

Pero parece que no puedo encontrar un equivalente en bash. El problema es que el paréntesis funciona como una función con su propio alcance y el retorno 1 no tendrá el comportamiento esperado.

Esto es lo que tengo hasta ahora, pero no es perfecto:

! do_something && log_error && return 1

El problema con esto es que el ! es confuso y el retorno 1 depende del éxito del registro.

Éste es mejor, pero más detallado:

do_something || (log_error; return 1) || return 1

¿Alguna idea?

Respuesta1

Utilice aparatos ortopédicos.

 do_something || { log_error; return 1;}

Respuesta2

El estado de salida de la última ejecución del comando se guarda en la $?variable. Entonces, podrías hacer algo como lo siguiente:

do something
if [[ $? > 0 ]]; then 
   do log_error; exit 1; 
fi

Me gusta eso por razones de legibilidad. Sin embargo, el tuyo es perfectamente bueno, sólo necesitas reemplazarlo &&con ;:

! do_something && log_error ; return 1

&&significa "ejecutar el siguiente comando SÓLO SI el anterior salió exitosamente" mientras que ;solo significa "ejecutar el siguiente comando".

información relacionada