mirror of
https://github.com/nvm-sh/nvm.git
synced 2026-09-18 00:00:30 +08:00
`unsetopt local_options nomatch` unsets both named options, so LOCAL_OPTIONS is off by the time the function returns and the `nomatch` change escapes into the caller's shell: one `nvm ls` or `nvm alias` leaves NO_MATCH off for the rest of the session, after which an unmatched glob is silently passed through as a literal. `setopt local_options nonomatch`, already used in `nvm_check_file_permissions`, restores on return. The `markdirs` line also cancelled the snapshot taken for `shwordsplit` on the line above it; that one is latent, as `nvm_ls` is only ever called inside a command substitution.
55 lines
1.6 KiB
Bash
Executable File
55 lines
1.6 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
die () { echo "$@" ; cleanup ; exit 1; }
|
|
|
|
cleanup () {
|
|
rm -rf "${TEST_DIR-}"
|
|
unset TEST_DIR NVM_DIR
|
|
}
|
|
|
|
: nvm.sh
|
|
\. ../../../nvm.sh
|
|
|
|
\. ../../common.sh
|
|
|
|
# `local_options` is zsh-only, so no other shell can regress this
|
|
[ -n "${ZSH_VERSION-}" ] || exit 0
|
|
|
|
# an isolated NVM_DIR with a single known version, so that ambient versions
|
|
# and aliases can not affect any assertions. `alias/lts` is deliberately absent:
|
|
# globbing it is why `nvm_list_aliases` has to suppress `nomatch` at all.
|
|
TEST_DIR="${PWD}/nvm_zsh_options_tmp"
|
|
mkdir -p "${TEST_DIR}/alias" "${TEST_DIR}/versions/node/v24.13.0/bin" || die 'failed to create test dirs'
|
|
make_echo "${TEST_DIR}/versions/node/v24.13.0/bin/node" 'v24.13.0' || die 'failed to create test node binary'
|
|
echo '24' > "${TEST_DIR}/alias/default" || die 'failed to create default alias'
|
|
NVM_DIR="${TEST_DIR}"
|
|
|
|
setopt nomatch
|
|
unsetopt markdirs
|
|
unsetopt shwordsplit
|
|
|
|
nvm_list_aliases >/dev/null 2>&1
|
|
[[ -o nomatch ]] || die 'nvm_list_aliases left nomatch unset'
|
|
|
|
nvm alias >/dev/null 2>&1
|
|
[[ -o nomatch ]] || die '"nvm alias" left nomatch unset'
|
|
|
|
nvm ls >/dev/null 2>&1
|
|
[[ -o nomatch ]] || die '"nvm ls" left nomatch unset'
|
|
|
|
# called directly rather than in a command substitution, so that anything
|
|
# `nvm_ls` fails to restore is visible here
|
|
nvm_ls 24 >/dev/null 2>&1
|
|
[[ -o markdirs ]] && die 'nvm_ls left markdirs set'
|
|
[[ -o shwordsplit ]] && die 'nvm_ls left shwordsplit set'
|
|
|
|
# and the inverse: a caller that wants these on has to get them back
|
|
setopt markdirs
|
|
setopt shwordsplit
|
|
|
|
nvm_ls 24 >/dev/null 2>&1
|
|
[[ -o markdirs ]] || die 'nvm_ls left markdirs unset'
|
|
[[ -o shwordsplit ]] || die 'nvm_ls left shwordsplit unset'
|
|
|
|
cleanup
|