die() {
echoIFS=' ' # make sure "$*" is joined with spaces
# output the arguments if any on stderr:
[ "$#" -eq 0 ] || printf '%s\n' "$*" 1>&2
exit 1
}
die() {
echolast_exit_status=$?
IFS=' '
printf '%s\n' "FATAL ERROR: $* (status $?$last_exit_status)" 1>&2
exit 1
}
When it fails, mkdir will likely already have issued an error message, so that second one may be seen as redundant, and you could just do:
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
(or use the first variant of die above without argument)
Just in case you haven't seen command1 || command2 before, it runs command1, and if command1 fails, it runs command2.
mkdir -p some/path || die "mkdir failed"
cd some/path || die "cd failed"
run_some_commandsome_command || die "some_command failed"
mkdir -p some/path || die "mkdir failed"
cd some/path || die "cd failed"
run_some_commandsome_command || die "some_command failed"
Or on the following line when the command lines are long:
mkdir -p some/path ||
die "mkdir failed"
cd some/path ||
die "cd failed"
some_command ||
die "some_command failed"
Also, if you are going to use the name some/path multiple times, store it in a variable so you don't have to keep typing it, and can easily change it if you need to. And when passing variable arguments to commands, make sure to use the -- option delimiter so that the argument is not taken as an option if it starts with -.
dir=some/path
mkdir -p "$dir" -- "$dir" || die "Cannot make $dir"
cd "$dir" -P -- "$dir" || die "Cannot cd to $dir"
run_some_commandsome_command || die "Cannot run some_command"