Some doom commands will generate a temporary script at
~/.emacs.d/.local/.doom.sh so that it can run an arbitrary shell command
after the current invocation of bin/doom ends. Very useful for, say,
restarting the currently running doom command after a destructive
operation, like updating Doom's source code, tangling your literate
config, or for launching arbitrary programs, like a new instance of
Emacs. This is necessary because elisp lacks an execv implementation.
However, for some folks, .doom.sh wasn't executing at all. This meant:
1. Some `doom upgrade`s would upgrade Doom itself but never move on to
the second step of the process: updating its packages.
2. Literate config users could tangle their configs on `doom sync`, but
the actual syncing process would never happen (#3746).
3. `doom run` would do nothing.
I hadn't realized /bin/sh runs bash in POSIX mode (at least, on systems
where /bin/sh = bash, like nixOS or macOS). In POSIX mode the script
will abort the if a builtin command (like export) returns a non-zero
exit code. Since .doom.sh is basically a bunch of exports followed by an
arbitrary command, and there are some environment variables
that can trigger validation errors (like UID triggering a "read-only
variable" error), we have a problem.
Hopefully addresses #3746