Open jlries61 opened 4 years ago
I can, if desired, try to put together a patch myself. I have dealt with these sorts of issues before.
All of those warnings in ksh are expected; nvm uses local on every variable. however, because we consistently use this pattern:
local foo
foo=bar
ksh warns on the local foo
line, and then the foo=bar
line is just a normal ksh local var, whereas every other shell creates a local var and then assigns it.
In other words, those warnings are expected and shouldn't interfere with nvm's functionality (see #574).
Separately, source /opt/local/share/nvm/init-nvm.sh
is very confusing - what is init-nvm.sh
? that's not a part of this project.
I had installed nvm via MacPorts and init-nvm.sh is part of that distribution. Apparently, it doesn't come from you. Subsequent to my filing the issue, I uninstalled the MacPorts version and installed nvm directly from Github, though I have not tried again with ksh (I temporarily switched my default shell to zsh, pending resolution of this issue). I will definitely try again with ksh, but I don't want my terminal littered with warnings every time I use nvm.
nvm is only supported when installed with the instructions in this repo.
I totally agree the warnings are disruptive; I'm more than happy to review a PR that fixes it, but I'm not sure how to do it that preserves local foo
in non-ksh shells :-/
You could define an environment variable LOCAL as "local" for shells that support it and blank otherwise.
I'm not sure if that actually works - i think it has to be a literal local foo
for shells to accept it. A PR that tested that would be appreciated tho.
I'd suggest adding local
as an alias for typeset
, such as:
alias local=typeset
Putting this in my .kshrc
before the call to . {path}/nvm.sh
silenced all the warnings about local: not found
. It may be that for this to work for the installation script (init-nvm.sh
), it would have be source
d, as aliases are not exported. I have not tested all the side effects, nor checked for which variables leaked due to them not actually being local.
As a solution to the general problem, we can try testing for ksh
and aliasing local
to typeset
at the start of the script, assuming it was not previously aliased. At the end of the script, we can unalias
it (only if we created it, of course).
Thus, at the top of the script, something like:
if [ $KSH_VERSION =~ ksh ] ; then
old_local_alias=$(alias local) 2>/dev/null
alias local=typeset
fi
And at the end of the script, something like:
if [ $KSH_VERSION =~ ksh ] ; then
if [[ -z $old_local_alias ]] ; then unalias local # Was not originally aliased
else alias local="${old_local_alias/#*=}" # Restore original alias value
fi
unset old_local_alias
fi
Something that worked for every runtime-called function in nvm would be great, yes. I'm not sure what that would be short of something like $is_ksh && local foo || typeset foo
at every callsite, though.
@ljharb Good point. I was thinking about installation and startup, not runtime. What about just recommending users include the alias in their .kshrc
? It seems to quiet the warnings, and the only issue is that the variables will not, in fact, be local.
(I apologize for recommending changes that I'm not taking the time to implement and test myself. Which is why I'm putting it forward as a suggestion, not a demand or request.)
That's a fine workaround in the meantime, but i wouldn't consider that the same thing as nvm supporting ksh.
Operating system and version:
MacOS X 10.14.6
nvm debug
output:nvm ls
output:How did you install
nvm
?MacPorts (
port install nvm
)What steps did you perform?
After installing the MacPorts version of ksh (the standard OSX one doesn't even recognize the
local
command), I ransource /opt/local/share/nvm/init-nvm.sh
.What happened?
-ksh: source[2]: source[3706]: local: local can only be used in a function -ksh: source[2]: source[3676]: local: local can only be used in a function -ksh: source[2]: source[886]: local: local can only be used in a function -ksh: source[2]: source[393]: local: local can only be used in a function -ksh: source[2]: source[302]: local: local can only be used in a function -ksh: source[2]: source[304]: local: local can only be used in a function -ksh: source[2]: source[312]: local: local can only be used in a function -ksh: source[2]: source[302]: local: local can only be used in a function -ksh: source[2]: source[304]: local: local can only be used in a function -ksh: source[2]: source[312]: local: local can only be used in a function -ksh: source[2]: source[3678]: local: local can only be used in a function -ksh: source[2]: source[3680]: local: local can only be used in a function
What did you expect to happen?
I expected the initialization script to complete silently.
Is there anything in any of your profile files that modifies the
PATH
?Yes.
If you are having installation issues, or getting "N/A", what does
curl -I --compressed -v https://nodejs.org/dist/
print out?