Una forma común es:
die() {
IFS=' ' # make sure "$*" is joined with spaces
# output the arguments if any on stderr:
[ "$#" -eq 0 ] || printf '%s\n' "$*" 1>&2
exit 1
}
entonces lo usas así:
mkdir -p some/path || die "mkdir failed with status $?"
O si desea que incluya el estado de salida, puede cambiarlo a:
die() {
last_exit_status=$?
IFS=' '
printf '%s\n' "FATAL ERROR: $* (status $last_exit_status)" 1>&2
exit 1
}
y luego usarlo es un poco más fácil:
mkdir -p some/path || die "mkdir failed"
Cuando falla, mkdir
es probable que ya haya emitido un mensaje de error, por lo que el segundo puede verse como redundante, y simplemente puede hacer:
mkdir -p some/path || exit # with the same (failing) exit status as mkdir's
mkdir -p some/path || exit 1 # with exit status 1 always
(o use la primera variante de die
arriba sin argumento)
En caso de que no lo haya visto command1 || command2
antes, se ejecuta command1
, y si command1
falla, se ejecuta command2
.
Entonces puedes leerlo como "crea el directorio o muere".
Su ejemplo se vería así:
mkdir -p some/path || die "mkdir failed"
cd some/path || die "cd failed"
some_command || die "some_command failed"
O puede alinearlo dies
más a la derecha para que el código principal sea más obvio.
mkdir -p some/path || die "mkdir failed"
cd some/path || die "cd failed"
some_command || die "some_command failed"
O en la siguiente línea cuando las líneas de comando son largas:
mkdir -p some/path ||
die "mkdir failed"
cd some/path ||
die "cd failed"
some_command ||
die "some_command failed"
Además, si va a usar el nombre some/path
varias veces, guárdelo en una variable para que no tenga que seguir escribiéndolo y puede cambiarlo fácilmente si lo necesita. Y cuando pase argumentos variables a comandos, asegúrese de usar el --
delimitador de opciones para que el argumento no se tome como una opción si comienza con -
.
dir=some/path
mkdir -p -- "$dir" || die "Cannot make $dir"
cd -P -- "$dir" || die "Cannot cd to $dir"
some_command || die "Cannot run some_command"
return $?
por la:
incorporada.Si realmente quiere
exit
un error y está usando Bash, entonces también debe considerarloset -e
. Dehelp set
:Por supuesto, esto no le brinda la flexibilidad de una función did_it_work (), pero es una manera fácil de asegurarse de que su script bash se detenga en un error sin agregar muchas llamadas a su nueva función.
fuente
set -e
es útil. Hay algunos comandos que devuelven valores distintos de cero en circunstancias normales (por ejemplodiff
). Cuando uso set -e en un script donde espero un retorno distinto de cero, lo hagocommand || true
.set -e
, puede establecer un "controlador de excepciones" para detectar todos los errorestrap did_it_work EXIT
.command && true
. Así, el valor de retorno no se modifica.command || true
es evitarset -e
salir del script sicommand
devuelve un código de salida distinto de cero. Cambia el código de salida porque necesitamos hacerlo. Lo único que secommand && true
hace es ejecutartrue
(devolver un código de salida cero) si el comando `tuvo éxito (devolvió un código de salida cero): es un completo no operativo.