nvm-sh / nvm

Node Version Manager - POSIX-compliant bash script to manage multiple active node.js versions
MIT License
79.09k stars 7.92k forks source link

init-nvm.sh fails under ksh #2206

Open jlries61 opened 4 years ago

jlries61 commented 4 years ago

Operating system and version:

MacOS X 10.14.6

nvm debug output:

```sh -ksh[2354]: local: local can only be used in a function -ksh[2369]: local: local can only be used in a function -ksh[2374]: local: local can only be used in a function -ksh[2375]: local: local can only be used in a function -ksh[2474]: local: local can only be used in a function -ksh[2354]: local: local can only be used in a function -ksh[2369]: local: local can only be used in a function -ksh[2374]: local: local can only be used in a function -ksh[2375]: local: local can only be used in a function nvm --version: v0.35.3 $TERM_PROGRAM: Apple_Terminal $SHELL: /opt/local/bin/ksh $SHLVL: 1 ${HOME}: /Users/jries -ksh[2301]: local: local can only be used in a function ${NVM_DIR}: '${HOME}/.nvm' -ksh[2301]: local: local can only be used in a function ${PATH}: /build/apps/bin:/opt/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/VMware Fusion.app/Contents/Public:/opt/X11/bin:${HOME}/Library/Python/3.8/bin:/opt/local/sbin -ksh[2301]: local: local can only be used in a function $PREFIX: '' -ksh[2301]: local: local can only be used in a function ${NPM_CONFIG_PREFIX}: '' $NVM_NODEJS_ORG_MIRROR: '' $NVM_IOJS_ORG_MIRROR: '' version sh (AT&T Research) 2020.0.0 shell version: '' uname -a: 'Darwin 18.7.0 Darwin Kernel Version 18.7.0: Mon Feb 10 21:08:45 PST 2020; root:xnu-4903.278.28~1/RELEASE_X86_64 x86_64' -ksh[1629]: local: local can only be used in a function -ksh[1631]: local: local can only be used in a function OS version: Mac 10.14.6 18G4032 -ksh[53]: local: local can only be used in a function -ksh[54]: local: local can only be used in a function curl: curl is a tracked alias for /opt/local/bin/curl, curl 7.69.1 (x86_64-apple-darwin18.7.0) libcurl/7.69.1 OpenSSL/1.1.1f zlib/1.2.11 libidn2/2.3.0 libpsl/0.21.0 (+libidn2/2.3.0) wget: not found -ksh[2515]: local: local can only be used in a function -ksh[1629]: local: local can only be used in a function -ksh[1631]: local: local can only be used in a function -ksh[53]: local: local can only be used in a function -ksh[54]: local: local can only be used in a function sed: sed is a tracked alias for /usr/bin/sed -ksh[53]: local: local can only be used in a function -ksh[54]: local: local can only be used in a function cut: cut is a tracked alias for /usr/bin/cut -ksh[53]: local: local can only be used in a function -ksh[54]: local: local can only be used in a function basename: basename is a tracked alias for /usr/bin/basename -ksh[53]: local: local can only be used in a function -ksh[54]: local: local can only be used in a function rm: rm is a tracked alias for /bin/rm -ksh[53]: local: local can only be used in a function -ksh[54]: local: local can only be used in a function mkdir: mkdir is a tracked alias for /bin/mkdir -ksh[53]: local: local can only be used in a function -ksh[54]: local: local can only be used in a function xargs: xargs is a tracked alias for /usr/bin/xargs -ksh[2530]: local: local can only be used in a function -ksh[53]: local: local can only be used in a function -ksh[54]: local: local can only be used in a function ls: git: No such file or directory -ksh[53]: local: local can only be used in a function -ksh[54]: local: local can only be used in a function git: git is a tracked alias for /opt/local/bin/git, git version 2.26.2 -ksh[2530]: local: local can only be used in a function -ksh[53]: local: local can only be used in a function -ksh[54]: local: local can only be used in a function ls: grep: No such file or directory -ksh[53]: local: local can only be used in a function -ksh[54]: local: local can only be used in a function grep: grep is a tracked alias for /usr/bin/grep, grep (BSD grep) 2.5.1-FreeBSD -ksh[2530]: local: local can only be used in a function -ksh[53]: local: local can only be used in a function -ksh[54]: local: local can only be used in a function ls: awk: No such file or directory -ksh[53]: local: local can only be used in a function -ksh[54]: local: local can only be used in a function awk: awk is a tracked alias for /usr/bin/awk, awk version 20070501 -ksh[2545]: local: local can only be used in a function -ksh[2301]: local: local can only be used in a function nvm current: -ksh[2354]: local: local can only be used in a function -ksh[2369]: local: local can only be used in a function -ksh[2374]: local: local can only be used in a function -ksh[2375]: local: local can only be used in a function -ksh[457]: local: local can only be used in a function -ksh[459]: local: local can only be used in a function -ksh[886]: local: local can only be used in a function -ksh[393]: local: local can only be used in a function -ksh[302]: local: local can only be used in a function -ksh[304]: local: local can only be used in a function -ksh[312]: local: local can only be used in a function -ksh[302]: local: local can only be used in a function -ksh[304]: local: local can only be used in a function -ksh[312]: local: local can only be used in a function system -ksh[2301]: local: local can only be used in a function which node: /opt/local/bin/node -ksh[2301]: local: local can only be used in a function which iojs: -ksh[2301]: local: local can only be used in a function which npm: /opt/local/bin/npm -ksh[2301]: local: local can only be used in a function npm config get prefix: /opt/local -ksh[2301]: local: local can only be used in a function npm root -g: /opt/local/lib/node_modules $ ```

nvm ls output:

```sh $ nvm ls -ksh[2354]: local: local can only be used in a function -ksh[2369]: local: local can only be used in a function -ksh[2374]: local: local can only be used in a function -ksh[2375]: local: local can only be used in a function -ksh[3205]: local: local can only be used in a function -ksh[3206]: local: local can only be used in a function -ksh[3207]: local: local can only be used in a function -ksh[3227]: local: local can only be used in a function -ksh[3228]: local: local can only be used in a function -ksh[1009]: local: local can only be used in a function -ksh[1011]: local: local can only be used in a function -ksh[1018]: local: local can only be used in a function -ksh[1020]: local: local can only be used in a function -ksh[1022]: local: local can only be used in a function -ksh[393]: local: local can only be used in a function -ksh[1024]: local: local can only be used in a function -ksh[393]: local: local can only be used in a function -ksh[1026]: local: local can only be used in a function -ksh[393]: local: local can only be used in a function -ksh[611]: local: local can only be used in a function -ksh[999]: local: local can only be used in a function -ksh[1044]: local: local can only be used in a function -ksh[1059]: local: local can only be used in a function -ksh[633]: local: local can only be used in a function -ksh[1069]: local: local can only be used in a function -ksh[1071]: local: local can only be used in a function -ksh[1073]: local: local can only be used in a function -ksh[1075]: local: local can only be used in a function -ksh[1109]: local: local can only be used in a function -ksh[1459]: local: local can only be used in a function -ksh[1460]: local: local can only be used in a function -ksh[1461]: local: local can only be used in a function -ksh[1462]: local: local can only be used in a function -ksh[886]: local: local can only be used in a function -ksh[393]: local: local can only be used in a function -ksh[302]: local: local can only be used in a function -ksh[304]: local: local can only be used in a function -ksh[312]: local: local can only be used in a function -ksh[302]: local: local can only be used in a function -ksh[304]: local: local can only be used in a function -ksh[312]: local: local can only be used in a function -ksh[1464]: local: local can only be used in a function -ksh[73]: local: local can only be used in a function -ksh[1468]: local: local can only be used in a function -ksh[1469]: local: local can only be used in a function -> system -ksh[2354]: local: local can only be used in a function -ksh[2369]: local: local can only be used in a function -ksh[2374]: local: local can only be used in a function -ksh[2375]: local: local can only be used in a function -ksh[3335]: local: local can only be used in a function -ksh[393]: local: local can only be used in a function -ksh[3337]: local: local can only be used in a function -ksh[886]: local: local can only be used in a function -ksh[393]: local: local can only be used in a function -ksh[302]: local: local can only be used in a function -ksh[304]: local: local can only be used in a function -ksh[312]: local: local can only be used in a function -ksh[302]: local: local can only be used in a function -ksh[304]: local: local can only be used in a function -ksh[312]: local: local can only be used in a function -ksh[3342]: local: local can only be used in a function -ksh[3343]: local: local can only be used in a function -ksh[3344]: local: local can only be used in a function -ksh[802]: local: local can only be used in a function -ksh[805]: local: local can only be used in a function -ksh[886]: local: local can only be used in a function -ksh[393]: local: local can only be used in a function -ksh[302]: local: local can only be used in a function -ksh[304]: local: local can only be used in a function -ksh[312]: local: local can only be used in a function -ksh[302]: local: local can only be used in a function -ksh[304]: local: local can only be used in a function -ksh[312]: local: local can only be used in a function -ksh[807]: local: local can only be used in a function -ksh[393]: local: local can only be used in a function -ksh[812]: local: local can only be used in a function [1] 2315 -ksh[750]: local: local can only be used in a function -ksh[756]: local: local can only be used in a function -ksh[762]: local: local can only be used in a function -ksh[764]: local: local can only be used in a function -ksh[820]: local: local can only be used in a function [1] 2320 [2] 2321 [3] 2322 -ksh[772]: local: local can only be used in a function -ksh[778]: local: local can only be used in a function -ksh[1547]: local: local can only be used in a function -ksh[1525]: local: local can only be used in a function -ksh[772]: local: local can only be used in a function -ksh[778]: local: local can only be used in a function -ksh[1527]: local: local can only be used in a function -ksh[1547]: local: local can only be used in a function -ksh[1525]: local: local can only be used in a function -ksh[1553]: local: local can only be used in a function -ksh[1527]: local: local can only be used in a function -ksh[772]: local: local can only be used in a function -ksh[1555]: local: local can only be used in a function -ksh[778]: local: local can only be used in a function -ksh[1547]: local: local can only be used in a function -ksh[1525]: local: local can only be used in a function -ksh[1557]: local: local can only be used in a function -ksh[1558]: local: local can only be used in a function -ksh[1559]: local: local can only be used in a function -ksh[1553]: local: local can only be used in a function -ksh[693]: local: local can only be used in a function -ksh[1555]: local: local can only be used in a function -ksh[695]: local: local can only be used in a function -ksh[697]: local: local can only be used in a function -ksh[1527]: local: local can only be used in a function -ksh[457]: local: local can only be used in a function -ksh[459]: local: local can only be used in a function -ksh[1557]: local: local can only be used in a function -ksh[470]: local: local can only be used in a function -ksh[1558]: local: local can only be used in a function -ksh[1559]: local: local can only be used in a function -ksh[1553]: local: local can only be used in a function -ksh[1555]: local: local can only be used in a function -ksh[1557]: local: local can only be used in a function -ksh[1558]: local: local can only be used in a function -ksh[1559]: local: local can only be used in a function -ksh[1009]: local: local can only be used in a function -ksh[1011]: local: local can only be used in a function -ksh[1009]: local: local can only be used in a function -ksh[1011]: local: local can only be used in a function -ksh[1018]: local: local can only be used in a function -ksh[1018]: local: local can only be used in a function -ksh[1020]: local: local can only be used in a function -ksh[1022]: local: local can only be used in a function -ksh[1020]: local: local can only be used in a function -ksh[393]: local: local can only be used in a function -ksh[1022]: local: local can only be used in a function -ksh[393]: local: local can only be used in a function -ksh[1024]: local: local can only be used in a function -ksh[393]: local: local can only be used in a function -ksh[1009]: local: local can only be used in a function -ksh[1011]: local: local can only be used in a function -ksh[1026]: local: local can only be used in a function -ksh[1018]: local: local can only be used in a function -ksh[1024]: local: local can only be used in a function -ksh[393]: local: local can only be used in a function -ksh[393]: local: local can only be used in a function -ksh[1026]: local: local can only be used in a function -ksh[393]: local: local can only be used in a function -ksh[1044]: local: local can only be used in a function -ksh[1020]: local: local can only be used in a function -ksh[1069]: local: local can only be used in a function -ksh[1071]: local: local can only be used in a function -ksh[1073]: local: local can only be used in a function -ksh[968]: local: local can only be used in a function -ksh[1075]: local: local can only be used in a function -ksh[969]: local: local can only be used in a function -ksh[1022]: local: local can only be used in a function -ksh[909]: local: local can only be used in a function -ksh[912]: local: local can only be used in a function -ksh[393]: local: local can only be used in a function -ksh[914]: local: local can only be used in a function -ksh[916]: local: local can only be used in a function -ksh[1024]: local: local can only be used in a function -ksh[393]: local: local can only be used in a function -ksh[1026]: local: local can only be used in a function -ksh[393]: local: local can only be used in a function -ksh[1044]: local: local can only be used in a function -ksh[1069]: local: local can only be used in a function -ksh[1071]: local: local can only be used in a function -ksh[1073]: local: local can only be used in a function -ksh[1075]: local: local can only be used in a function -ksh[953]: local: local can only be used in a function -ksh[1109]: local: local can only be used in a function -ksh[611]: local: local can only be used in a function -ksh[999]: local: local can only be used in a function -ksh[1044]: local: local can only be used in a function -ksh[1059]: local: local can only be used in a function -ksh[633]: local: local can only be used in a function -ksh[641]: local: local can only be used in a function -ksh[643]: local: local can only be used in a function -ksh[1069]: local: local can only be used in a function -ksh[1071]: local: local can only be used in a function -ksh[1073]: local: local can only be used in a function -ksh[1075]: local: local can only be used in a function -ksh[1109]: local: local can only be used in a function -ksh[702]: local: local can only be used in a function -ksh[703]: local: local can only be used in a function -ksh[704]: local: local can only be used in a function -ksh[708]: local: local can only be used in a function -ksh[713]: local: local can only be used in a function -ksh[73]: local: local can only be used in a function -ksh[1600]: local: local can only be used in a function -ksh[1601]: local: local can only be used in a function -ksh[1602]: local: local can only be used in a function -ksh[1603]: local: local can only be used in a function -ksh[1604]: local: local can only be used in a function -ksh[693]: local: local can only be used in a function -ksh[695]: local: local can only be used in a function -ksh[697]: local: local can only be used in a function -ksh[457]: local: local can only be used in a function -ksh[459]: local: local can only be used in a function -ksh[470]: local: local can only be used in a function -ksh[1009]: local: local can only be used in a function -ksh[1011]: local: local can only be used in a function -ksh[1018]: local: local can only be used in a function -ksh[1020]: local: local can only be used in a function -ksh[1022]: local: local can only be used in a function -ksh[393]: local: local can only be used in a function -ksh[1024]: local: local can only be used in a function -ksh[393]: local: local can only be used in a function -ksh[1026]: local: local can only be used in a function -ksh[393]: local: local can only be used in a function -ksh[968]: local: local can only be used in a function -ksh[969]: local: local can only be used in a function -ksh[909]: local: local can only be used in a function -ksh[912]: local: local can only be used in a function -ksh[914]: local: local can only be used in a function -ksh[916]: local: local can only be used in a function -ksh[611]: local: local can only be used in a function -ksh[999]: local: local can only be used in a function -ksh[1109]: local: local can only be used in a function -ksh[702]: local: local can only be used in a function -ksh[703]: local: local can only be used in a function -ksh[704]: local: local can only be used in a function -ksh[708]: local: local can only be used in a function -ksh[713]: local: local can only be used in a function -ksh[73]: local: local can only be used in a function -ksh[1600]: local: local can only be used in a function -ksh[1601]: local: local can only be used in a function -ksh[1602]: local: local can only be used in a function -ksh[1603]: local: local can only be used in a function -ksh[1604]: local: local can only be used in a function -ksh[772]: local: local can only be used in a function -ksh[778]: local: local can only be used in a function -ksh[1547]: local: local can only be used in a function -ksh[1525]: local: local can only be used in a function -ksh[1527]: local: local can only be used in a function -ksh[1553]: local: local can only be used in a function -ksh[1555]: local: local can only be used in a function -ksh[1557]: local: local can only be used in a function -ksh[1558]: local: local can only be used in a function -ksh[1559]: local: local can only be used in a function -ksh[1570]: local: local can only be used in a function -ksh[1571]: local: local can only be used in a function -ksh[1009]: local: local can only be used in a function -ksh[1011]: local: local can only be used in a function -ksh[1018]: local: local can only be used in a function -ksh[1020]: local: local can only be used in a function -ksh[1022]: local: local can only be used in a function -ksh[393]: local: local can only be used in a function -ksh[1024]: local: local can only be used in a function -ksh[393]: local: local can only be used in a function -ksh[1026]: local: local can only be used in a function -ksh[393]: local: local can only be used in a function -ksh[1044]: local: local can only be used in a function -ksh[1069]: local: local can only be used in a function -ksh[1071]: local: local can only be used in a function -ksh[1073]: local: local can only be used in a function -ksh[1075]: local: local can only be used in a function -ksh[999]: local: local can only be used in a function -ksh[1109]: local: local can only be used in a function -ksh[693]: local: local can only be used in a function -ksh[695]: local: local can only be used in a function -ksh[697]: local: local can only be used in a function -ksh[457]: local: local can only be used in a function -ksh[459]: local: local can only be used in a function -ksh[470]: local: local can only be used in a function -ksh[1009]: local: local can only be used in a function -ksh[1011]: local: local can only be used in a function -ksh[1018]: local: local can only be used in a function -ksh[1020]: local: local can only be used in a function -ksh[1022]: local: local can only be used in a function -ksh[393]: local: local can only be used in a function -ksh[1024]: local: local can only be used in a function -ksh[393]: local: local can only be used in a function -ksh[1026]: local: local can only be used in a function -ksh[393]: local: local can only be used in a function -ksh[968]: local: local can only be used in a function -ksh[969]: local: local can only be used in a function -ksh[909]: local: local can only be used in a function -ksh[912]: local: local can only be used in a function -ksh[914]: local: local can only be used in a function -ksh[916]: local: local can only be used in a function -ksh[611]: local: local can only be used in a function -ksh[999]: local: local can only be used in a function -ksh[702]: local: local can only be used in a function -ksh[703]: local: local can only be used in a function -ksh[704]: local: local can only be used in a function -ksh[708]: local: local can only be used in a function -ksh[713]: local: local can only be used in a function -ksh[73]: local: local can only be used in a function iojs -> N/A (default) node -> stable (-> N/A) (default) unstable -> N/A (default) -ksh[836]: local: local can only be used in a function [1] 2427 -ksh[750]: local: local can only be used in a function -ksh[756]: local: local can only be used in a function -ksh[762]: local: local can only be used in a function -ksh[764]: local: local can only be used in a function ```

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 ran source /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.

PATH=/build/apps/bin:$PATH:$HOME/Library/Python/3.8/bin:/opt/local/sbin
export PATH

If you are having installation issues, or getting "N/A", what does curl -I --compressed -v https://nodejs.org/dist/ print out?

```sh * Trying 2606:4700:10::6814:162e:443... * Connected to nodejs.org (2606:4700:10::6814:162e) port 443 (#0) * ALPN, offering http/1.1 * successfully set certificate verify locations: * CAfile: /opt/local/share/curl/curl-ca-bundle.crt CApath: none * TLSv1.3 (OUT), TLS handshake, Client hello (1): * TLSv1.3 (IN), TLS handshake, Server hello (2): * TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8): * TLSv1.3 (IN), TLS handshake, Certificate (11): * TLSv1.3 (IN), TLS handshake, CERT verify (15): * TLSv1.3 (IN), TLS handshake, Finished (20): * TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1): * TLSv1.3 (OUT), TLS handshake, Finished (20): * SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 * ALPN, server accepted to use http/1.1 * Server certificate: * subject: OU=Domain Control Validated; OU=PositiveSSL Wildcard; CN=*.nodejs.org * start date: Oct 21 00:00:00 2019 GMT * expire date: Jan 18 23:59:59 2022 GMT * subjectAltName: host "nodejs.org" matched cert's "nodejs.org" * issuer: C=GB; ST=Greater Manchester; L=Salford; O=Sectigo Limited; CN=Sectigo RSA Domain Validation Secure Server CA * SSL certificate verify ok. > HEAD /dist/ HTTP/1.1 > Host: nodejs.org > User-Agent: curl/7.69.1 > Accept: */* > Accept-Encoding: deflate, gzip > * TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): * TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): * old SSL session ID is stale, removing * Mark bundle as not supporting multiuse < HTTP/1.1 200 OK HTTP/1.1 200 OK < Date: Mon, 27 Apr 2020 20:49:13 GMT Date: Mon, 27 Apr 2020 20:49:13 GMT < Content-Type: text/html Content-Type: text/html < Connection: keep-alive Connection: keep-alive < Set-Cookie: __cfduid=d9b8004f7b343664771e9eaf3123ba85d1588020553; expires=Wed, 27-May-20 20:49:13 GMT; path=/; domain=.nodejs.org; HttpOnly; SameSite=Lax Set-Cookie: __cfduid=d9b8004f7b343664771e9eaf3123ba85d1588020553; expires=Wed, 27-May-20 20:49:13 GMT; path=/; domain=.nodejs.org; HttpOnly; SameSite=Lax < Cache-Control: max-age=14400 Cache-Control: max-age=14400 < CF-Cache-Status: HIT CF-Cache-Status: HIT < Age: 819 Age: 819 < Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct" Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct" < Vary: Accept-Encoding Vary: Accept-Encoding < Server: cloudflare Server: cloudflare < CF-RAY: 58ab68ab197e9328-SJC CF-RAY: 58ab68ab197e9328-SJC < Content-Encoding: gzip Content-Encoding: gzip < cf-request-id: 025effbeea000093283e2f9200000001 cf-request-id: 025effbeea000093283e2f9200000001 < * Connection #0 to host nodejs.org left intact ```
jlries61 commented 4 years ago

I can, if desired, try to put together a patch myself. I have dealt with these sorts of issues before.

ljharb commented 4 years ago

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.

jlries61 commented 4 years ago

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.

ljharb commented 4 years ago

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 :-/

jlries61 commented 4 years ago

You could define an environment variable LOCAL as "local" for shells that support it and blank otherwise.

ljharb commented 4 years ago

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.

masalomon commented 2 years ago

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 sourced, 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
ljharb commented 2 years ago

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.

masalomon commented 2 years ago

@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.)

ljharb commented 2 years ago

That's a fine workaround in the meantime, but i wouldn't consider that the same thing as nvm supporting ksh.