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"