@@ -1254,24 +1254,33 @@ nvm_change_path() {
12541254 # if there’s no initial path, just return the supplementary path
12551255 if [ -z " ${1-} " ]; then
12561256 nvm_echo " ${3-}${2-} "
1257+ return
1258+ fi
1259+ # `${NVM_DIR}` is matched literally, so escape characters that are special in regexes
1260+ local NVM_DIR_RE
1261+ NVM_DIR_RE=" $( nvm_echo " ${NVM_DIR} " | command sed ' s/[][\.*^$+?(){}|]/\\&/g' ) "
12571262 # if the initial path doesn’t contain an nvm path, prepend the supplementary
12581263 # path
1259- elif ! nvm_echo " ${1-} " | nvm_grep -q " ${NVM_DIR } /[^/]*${2-} " \
1260- && ! nvm_echo " ${1-} " | nvm_grep -q " ${NVM_DIR } /versions/[^/]*/[^/]*${2-} " ; then
1264+ if ! nvm_echo " ${1-} " | nvm_grep -Eq " ${NVM_DIR_RE } /[^/]*${2-} " \
1265+ && ! nvm_echo " ${1-} " | nvm_grep -Eq " ${NVM_DIR_RE } /versions/[^/]*/[^/]*${2-} " ; then
12611266 nvm_echo " ${3-}${2-} :${1-} "
12621267 # if the initial path contains BOTH an nvm path (checked for above) and
12631268 # that nvm path is preceded by a system binary path, just prepend the
12641269 # supplementary path instead of replacing it.
12651270 # https://github.com/nvm-sh/nvm/issues/1652#issuecomment-342571223
1266- elif nvm_echo " ${1-} " | nvm_grep -Eq " (^|:)(/usr(/local)?)?${2-} :.*${NVM_DIR } /[^/]*${2-} " \
1267- || nvm_echo " ${1-} " | nvm_grep -Eq " (^|:)(/usr(/local)?)?${2-} :.*${NVM_DIR } /versions/[^/]*/[^/]*${2-} " ; then
1271+ elif nvm_echo " ${1-} " | nvm_grep -Eq " (^|:)(/usr(/local)?)?${2-} :.*${NVM_DIR_RE } /[^/]*${2-} " \
1272+ || nvm_echo " ${1-} " | nvm_grep -Eq " (^|:)(/usr(/local)?)?${2-} :.*${NVM_DIR_RE } /versions/[^/]*/[^/]*${2-} " ; then
12681273 nvm_echo " ${3-}${2-} :${1-} "
12691274 # use sed to replace the existing nvm path with the supplementary path. This
12701275 # preserves the order of the path.
12711276 else
1272- nvm_echo " ${1-} " | command sed \
1273- -e " s#${NVM_DIR} /[^/]*${2-} [^:]*#${3-}${2-} #" \
1274- -e " s#${NVM_DIR} /versions/[^/]*/[^/]*${2-} [^:]*#${3-}${2-} #"
1277+ local NVM_DIR_SED
1278+ NVM_DIR_SED=" $( nvm_echo " ${NVM_DIR_RE} " | command sed ' s/#/\\#/g' ) "
1279+ local NEW_DIR_SED
1280+ NEW_DIR_SED=" $( nvm_echo " ${3-} " | command sed ' s/[\&#]/\\&/g' ) "
1281+ nvm_echo " ${1-} " | command sed -E \
1282+ -e " s#${NVM_DIR_SED} /[^/]*${2-} [^:]*#${NEW_DIR_SED}${2-} #" \
1283+ -e " s#${NVM_DIR_SED} /versions/[^/]*/[^/]*${2-} [^:]*#${NEW_DIR_SED}${2-} #"
12751284 fi
12761285}
12771286
@@ -3638,14 +3647,29 @@ nvm_has_solaris_binary() {
36383647 fi
36393648}
36403649
3650+ # replaces every literal occurrence of $2 in $1 with $3; values go through the
3651+ # environment so awk does not interpret backslash escapes or regex characters
3652+ nvm_replace_literal () {
3653+ nvm_echo " ${1-} " | NVM_FROM=" ${2-} " NVM_TO=" ${3-} " command awk '
3654+ BEGIN { from = ENVIRON["NVM_FROM"]; to = ENVIRON["NVM_TO"]; n = length(from) }
3655+ {
3656+ out = ""; s = $0
3657+ while (n > 0 && (i = index(s, from)) > 0) {
3658+ out = out substr(s, 1, i - 1) to
3659+ s = substr(s, i + n)
3660+ }
3661+ print out s
3662+ }'
3663+ }
3664+
36413665nvm_sanitize_path () {
36423666 local SANITIZED_PATH
36433667 SANITIZED_PATH=" ${1-} "
36443668 if [ " _${SANITIZED_PATH} " != " _${NVM_DIR} " ]; then
3645- SANITIZED_PATH=" $( nvm_echo " ${SANITIZED_PATH} " | command sed -e " s# ${NVM_DIR} # \ $ {NVM_DIR}#g " ) "
3669+ SANITIZED_PATH=" $( nvm_replace_literal " ${SANITIZED_PATH} " " ${NVM_DIR} " ' ${NVM_DIR}' ) "
36463670 fi
36473671 if [ " _${SANITIZED_PATH} " != " _${HOME} " ]; then
3648- SANITIZED_PATH=" $( nvm_echo " ${SANITIZED_PATH} " | command sed -e " s# ${HOME} # \ $ {HOME}#g " ) "
3672+ SANITIZED_PATH=" $( nvm_replace_literal " ${SANITIZED_PATH} " " ${HOME} " ' ${HOME}' ) "
36493673 fi
36503674 nvm_echo " ${SANITIZED_PATH} "
36513675}
@@ -5426,7 +5450,7 @@ nvm() {
54265450 nvm_install_lock_name nvm_acquire_install_lock nvm_release_install_lock \
54275451 nvm_list_aliases nvm_make_alias nvm_print_alias_file nvm_print_alias_path \
54285452 nvm_print_default_alias nvm_print_formatted_alias nvm_resolve_local_alias \
5429- nvm_sanitize_path nvm_has_colors nvm_has_italics nvm_process_parameters \
5453+ nvm_replace_literal nvm_sanitize_path nvm_has_colors nvm_has_italics nvm_process_parameters \
54305454 nvm_node_version_has_solaris_binary nvm_iojs_version_has_solaris_binary \
54315455 nvm_curl_libz_support nvm_command_info nvm_is_zsh nvm_stdout_is_terminal \
54325456 nvm_npmrc_bad_news_bears nvm_sanitize_auth_header \
0 commit comments