Enquanto escrevia esta pergunta, percebi que uma possível solução seria:
mkdir abc || { echo error >&2; exit 1; }
... # do stuff (which might alter $?)
cd abc || { echo error >&2; exit 1; }
... # do more stuff
do_something_else || { echo error >&2; exit 1; }
... # do even more
last_thing || { echo error >&2; exit 1; }
... # do final stuff
Nesse caso, nenhuma variável $status é necessária e os comandos serão executados somente se os anteriores forem bem-sucedidos. E, eu também percebo, é aqui que uma função die "error message" seria útil para ecoar a mensagem de erro e sair com o código de erro.
Atualizar
Com die , seria:
die() { echo "$*" >&2; exit 1; }
mkdir abc || die "error"
... # do stuff
cd abc || die "error"
... # do more stuff
do_something_else || die "error"
... # do even more
last_thing || die "error"
... # do final stuff