diff --git a/nvm.sh b/nvm.sh index ce84b0ea..6b1d6eaf 100755 --- a/nvm.sh +++ b/nvm.sh @@ -41,7 +41,13 @@ nvm_echo_with_colors() { } nvm_cd() { - \cd "$@" + # `\cd` still runs a user-defined `cd` function; in zsh, `command cd` runs `/usr/bin/cd` instead of the builtin + if [ -n "${ZSH_VERSION-}" ]; then + # shellcheck disable=SC3044 + builtin cd "$@" + else + command cd "$@" + fi } # a caller that closed stderr, rather than redirecting it to /dev/null, makes @@ -3516,7 +3522,7 @@ nvm_die_on_prefix() { local NVM_CONFIG_VALUE eval "NVM_CONFIG_VALUE=\"\$${NVM_NPM_CONFIG_x_PREFIX_ENV}\"" if [ -n "${NVM_CONFIG_VALUE-}" ] && [ "_${NVM_OS}" = "_win" ]; then - NVM_CONFIG_VALUE="$(cd "$NVM_CONFIG_VALUE" 2>/dev/null && pwd)" + NVM_CONFIG_VALUE="$(nvm_cd "$NVM_CONFIG_VALUE" 2>/dev/null && pwd)" fi if [ -n "${NVM_CONFIG_VALUE-}" ] && ! nvm_tree_contains_path "${NVM_DIR}" "${NVM_CONFIG_VALUE}"; then nvm deactivate >/dev/null 2>&1 diff --git a/test/fast/Unit tests/nvm_cd b/test/fast/Unit tests/nvm_cd new file mode 100755 index 00000000..aa7f457d --- /dev/null +++ b/test/fast/Unit tests/nvm_cd @@ -0,0 +1,23 @@ +#!/bin/sh + +die () { echo "$@" ; exit 1; } + +: nvm.sh +\. ../../../nvm.sh + +EXPECTED="$(\cd .. && pwd)" + +# a user-defined `cd` function that rejects nvm's arguments, like cdhist's (#3835) +cd() { + echo 'user-defined cd function was called' >&2 + return 1 +} + +OUTPUT="$(nvm_cd .. 2>&1 && pwd)" +[ "${OUTPUT}" = "${EXPECTED}" ] || die "expected '${EXPECTED}', got '${OUTPUT}'" + +# shellcheck disable=SC2086 +OUTPUT="$(nvm_cd ${NVM_CD_FLAGS} .. 2>&1 && pwd)" +[ "${OUTPUT}" = "${EXPECTED}" ] || die "with NVM_CD_FLAGS '${NVM_CD_FLAGS}', expected '${EXPECTED}', got '${OUTPUT}'" + +unset -f cd