diff --git a/nvm.sh b/nvm.sh index e3098b8..f40a9f3 100644 --- a/nvm.sh +++ b/nvm.sh @@ -2742,6 +2742,15 @@ nvm() { EXIT_CODE="$?" set -a return "$EXIT_CODE" + elif [ -n "${BASH-}" ] && [ "${-#*E}" != "$-" ]; then + # shellcheck disable=SC3041 + set +E + local EXIT_CODE + IFS="${DEFAULT_IFS}" nvm "$@" + EXIT_CODE="$?" + # shellcheck disable=SC3041 + set -E + return "$EXIT_CODE" elif [ "${IFS}" != "${DEFAULT_IFS}" ]; then IFS="${DEFAULT_IFS}" nvm "$@" return "$?" diff --git a/test/installation_node/install on bash with ERR trap and set -E b/test/installation_node/install on bash with ERR trap and set -E new file mode 100755 index 0000000..edfad0c --- /dev/null +++ b/test/installation_node/install on bash with ERR trap and set -E @@ -0,0 +1,50 @@ +#!/bin/sh + +set -e + +cleanup() { + nvm cache clear + nvm deactivate + rm -rf "${NVM_DIR}"/v* + nvm unalias default +} + +die() { + echo "$@" + cleanup || true + exit 1 +} + +\. ../../nvm.sh + +if [ -z "${BASH-}" ]; then + echo "This test only applies to Bash; skipping" + exit +fi + +cleanup || true +trap 'echo "==> EXIT signal received (status: $?)"; cleanup' EXIT + +# shellcheck disable=SC3047 +trap 'echo "==> ERR signal received"; exit 1' ERR +# shellcheck disable=SC3041 +set -E + +# shellcheck disable=SC3045,SC3047 +ERR_TRAP_EXPECTED="$(trap -p ERR)" + +# Adding ` || die 'install failed'` implicitly disables error handling and +# prevents ERR trap execution, so for the purposes of this test, `nvm install` +# can't be part of another command or statement +nvm install node + +case "$-" in +*E*) + # shellcheck disable=SC3045,SC3047 + [ "$(trap -p ERR)" = "$ERR_TRAP_EXPECTED" ] || + die "ERR trap not restored after \"nvm install $VERSION\"" + ;; +*) + die "errtrace not restored after \"nvm install $VERSION\"" + ;; +esac