mirror of
https://github.com/nvm-sh/nvm.git
synced 2026-09-12 00:01:44 +08:00
Under bash's `set +h`, `hash -r` errors with "hash: hashing disabled",
which is then printed on every `nvm use`, including the one at shell startup.
Guarding on `$-` alone would be wrong:
`zsh` never puts `h` in `$-` - there `h` is `HIST_IGNORE_DUPS` -
and `dash` has no `h` flag at all,
so it would skip the call in 3 of the 4 shells the fast suite runs.
Gate on the shell instead, and skip only where the call fails:
bash under `set +h`, and `ksh93`, whose `hash` takes no `-r` and whose
usage error aborts `nvm use` before it can export `NVM_BIN`.
`ksh` is detected by probing rather than by version,
so `mksh` and `pdksh`, which do accept `-r`, keep getting the call.
The `${-#*h}` test is from #3910.
Refs #2065
Refs #3247
28 lines
915 B
Bash
Executable File
28 lines
915 B
Bash
Executable File
#!/bin/sh
|
|
|
|
die () { echo "$@" ; exit 1; }
|
|
|
|
: nvm.sh
|
|
\. ../../../nvm.sh
|
|
|
|
# also covers #3247, where `command hash -r` found a `hash` binary, not the builtin
|
|
OUTPUT="$(nvm_hash_reset 2>&1)"
|
|
RC=$?
|
|
[ ${RC} -eq 0 ] || die "nvm_hash_reset returned ${RC}: ${OUTPUT}"
|
|
[ -z "${OUTPUT}" ] || die "nvm_hash_reset was not silent: ${OUTPUT}"
|
|
|
|
# bash is the only supported shell that can turn hashing off
|
|
if [ -n "${BASH_VERSION-}" ]; then
|
|
set +h
|
|
OUTPUT="$(nvm_hash_reset 2>&1)"
|
|
RC=$?
|
|
set -h
|
|
[ ${RC} -eq 0 ] || die "with hashing disabled, nvm_hash_reset returned ${RC}: ${OUTPUT}"
|
|
[ -z "${OUTPUT}" ] || die "with hashing disabled, nvm_hash_reset was not silent: ${OUTPUT}"
|
|
|
|
ls >/dev/null 2>&1
|
|
hash -t ls >/dev/null 2>&1 || die 'expected `ls` to be hashed'
|
|
nvm_hash_reset || die 'with hashing enabled, nvm_hash_reset failed'
|
|
! hash -t ls >/dev/null 2>&1 || die 'nvm_hash_reset did not clear the hash table'
|
|
fi
|