scripts script resueltos programas programacion pasar parametros espaƱol ejercicios ejemplos comandos comando bash

bash - programas - scripts linux ejercicios resueltos



Ejecute varios comandos en una secuencia de comandos bash secuencialmente y falle si al menos uno de ellos falla (3)

Si desea saber qué comando falló, pero no necesariamente su código de retorno, puede usar:

#!/bin/bash rc=0; counter=0; command1 || let "rc += 1 << $counter"; let counter+=1; command2 || let "rc += 1 << $counter"; let counter+=1; command3 || let "rc += 1 << $counter"; let counter+=1; exit $rc

Esto utiliza el desplazamiento de bits en bash para establecer el bit correspondiente al comando que falló.

Por lo tanto, si el primer comando falló, obtendrás un código de retorno de 1 (= 2 ^ 0), si el tercer error obtendrías un código de retorno de 8 (= 2 ^ 3), y si tanto el primer comando como el tercero fallido obtendría 9 como el código de retorno.

Tengo un script de bash que utilizo para ejecutar varios comandos en secuencia y necesito devolver un código de salida distinto de cero si al menos un comando en la secuencia devuelve un código de salida distinto de cero. Sé que hay un comando de wait para eso, pero no estoy seguro de entender cómo usarlo.

UPD El script se ve así:

#!/bin/bash command1 command2 command3

Todos los comandos se ejecutan en primer plano. Todos los comandos deben ejecutarse independientemente del estado de salida que devolvió el comando anterior (por lo que no debe comportarse como "salir en el primer error"). Básicamente, necesito reunir todos los estados de salida y devolver el estado de salida global en consecuencia.


Si por secuencia te refieres a pipe, entonces necesitas configurar pipefail en tu script como set -o pipefail . De man bash :

El estado de retorno de una tubería es el estado de salida del último comando, a menos que la opción pipefail esté habilitada. Si pipefail está habilitado, el estado de retorno de la tubería es el valor del último comando (extremo derecho) para salir con un estado distinto de cero, o cero si todos los comandos salen correctamente. Si la palabra reservada! precede a una tubería, el estado de salida de esa tubería es la negación lógica del estado de salida como se describe anteriormente. El shell espera a que todos los comandos en la tubería terminen antes de devolver un valor.

Si solo quiere decir comandos secuenciales, simplemente verifique el estado de salida de cada comando y establezca un indicador si el estado de salida es cero. Haga que su script devuelva el valor de la bandera como:

#!/bin/bash EXIT=0 grep -q A <<< ''ABC'' || EXIT=$? # Will exit with 0 grep -q a <<< ''ABC'' || EXIT=$? # Will exit with 1 grep -q A <<< ''ABC'' || EXIT=$? # Will exit with 0 echo $EXIT # Will print 1 exit $EXIT # Exit status of script will be 1

Esto utiliza el operador lógico O || para establecer solo EXIT si el comando falla. Si varios comandos fallan, el estado de salida del último comando fallido será devuelto por el script.

Si estos comandos no se ejecutan en segundo plano, la wait no es relevante aquí.


Solo hazlo:

EXIT_STATUS=0 command1 || EXIT_STATUS=$? command2 || EXIT_STATUS=$? command3 || EXIT_STATUS=$? exit $EXIT_STATUS

No estoy seguro de cuál de los estados debería devolver si varios de los comandos han fallado.