关于MAC系统环境变量配置,执行npm install xxx 时报错npm error 没有权限permitted,sudo: 和npm:command not found的报错提示的解决办法

刚开始只是一个项目打包报错

<--- Last few GCs ---> [8928:0x128008000] 39920 ms: Scavenge 2026.3 (2081.4) -> 2019.6 (2081.7) MB, 6.8 / 0.0 ms (average mu = 0.586, current mu = 0.404) allocation failure [8928:0x128008000] 39929 ms: Scavenge 2026.8 (2081.7) -> 2020.1 (2082.9) MB, 3.1 / 0.0 ms (average mu = 0.586, current mu = 0.404) allocation failure [8928:0x128008000] 39945 ms: Scavenge 2027.6 (2082.9) -> 2021.0 (2098.9) MB, 9.1 / 0.0 ms (average mu = 0.586, current mu = 0.404) allocation failure <--- JS stacktrace ---> FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory

注意这里显示FATAL 致命错误,这个问题通常发生在编译或打包大型项目时,JavaScript 堆内存用满了,并且 V8 引擎无法继续分配内存。

原来的 package.json 是这样的

"dev": "vite --open",

"serve": "vite build && vite preview",

"build": "vite build", "lint:eslint": "eslint --cache --ma

后面使用 --max-old-space-size 参数来增加 Node.js 进程的内存限制,你需要修改 scripts 部分的相应命令。--max-old-space-size 参数的值为 4096,即 4GB。

"scripts": {
  "serve": "NODE_OPTIONS=--max-old-space-size=4096 vite build && vite preview",
  "build": "NODE_OPTIONS=--max-old-space-size=4096 vite build",
  ...
}

后来 又觉得每次都在后面加个命令太麻烦,想着能否升级下 Node.js 版本:尝试升级你使用的 Node.js 版本到最新的稳定版,以便享受更好的性能和内存管理。我的MAC系统一直都是使用n作为node版本管理器的,但是在使用n升级过程中就出现了

sudo n Password: jason is not in the sudoers file. This incident has been reported to the administrator.

显示我不是超管用户,可是我电脑只有这一个用户,怎么试都不行,想要删除多余的node版本时也不行

rm: /usr/local/n/versions/node/19.4.0/share/doc: Permission denied rm: /usr/local/n/versions/node/19.4.0/share: Permission denied rm: /usr/local/n/versions/node/19.4.0: Permission denied

没有管理员权限,无法删除 /usr/local/n 目录下的文件和文件夹。只有具有管理员权限的用户才能删除这些文件。

在查找了众多资料的基础上,后来发现是系统升级的原因导致,苹果系统的 shell 和 GUI 似乎产生了脑裂问题,shell 不认为你是管理员了,但是 GUI 还认!也因此可以通过 GUI 的方式修复了 sudoers 文件。 ​

具体可以参考下面知乎大佬的文章:

OS终端里 ** is not in the sudoers file怎么解决哇? - 知乎

按照他的说法执行替换,后来发现有更简便的方式,去操作这个sudoers的文件,这个文件在系统里默认是只读的,在文件右键-显示简介-共享与访问权限将系统、admin、和你的用户名添加读写权限就可以了。

按照以上步骤执行完了之后,想用n 更新下node版本,例如使用:n 18.18.0,安装过程中就会提示没有权限

jason@JasonyedeMBP fe_wcrm % n 18.18.0 installing : node-v18.18.0 mkdir : /usr/local/n/versions/node/18.18.0 mkdir: /usr/local/n/versions/node/18.18.0: Permission denied Error: sudo required (or change ownership, or define N_PREFIX) jason@JasonyedeMBP fe_wcrm % sudo n 18.18.0 Password: sudo: n: command not found

使用n安装提示没有权限创建文件夹,使用sudo提示n not found

好家伙,那我就想着使用npm重新安装下n呗,结果使用sudo npm install -g n Password: sudo: npm: command not found依然报找不到。

在询问了gpt和来来回回反反复复折腾了MAC上的zsh shell和bash shell的file配置文件和官网重新安装了node.js之后,确保我的环境变量在系统中存在

 

 

 最终发现问题可能是由于sudo命令无法找到正确的环境变量而引起的。于是每次执行sudo 都在后买带上当前的环境变量。就可以了

sudo env "PATH=$PATH" npm uninstall -g n

问题到这里,看起来似乎已经结束了。

但是每次执行sudo 都要带上env "PATH=$PATH",才能执行成功。可是我的MAC电脑就只我一个用户,我不应该就是超管吗,我的环境变量不就是超管的环境变量吗?

继续寻根究底...

询问gpt,得到

要检查/etc/sudoers文件中是否有与secure_path相关的设置,您可以按照以下步骤进行操作:

  1. 打开终端应用程序。
  2. 运行以下命令以使用超级用户权限打开/etc/sudoers文件:
    sudo visudo 这将打开sudoers文件并使用visudo编辑器进行编辑,visudo会在编辑完成后检查文件的语法错误。
    
  3. sudoers文件中查找是否有类似以下行的设置:
    Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" 如果存在这样的行,并且其中的路径设置与您的环境变量路径相匹配,则表示secure_path已经设置正确。
  4. 如果找不到此行或者路径设置不正确,您可以使用编辑器修改secure_path的设置,将其设置为您环境变量中正确的路径。请注意,在编辑sudoers文件时务必小心,如果出现语法错误可能会导致系统问题。
  5. 编辑完成后,使用Ctrl + X组合键保存并退出编辑器。

请注意,在修改sudoers文件之前,请确保了解您的操作系统和文件系统的工作原理,并且谨慎操作以避免任何潜在的问题或安全风险。如果您对此过程感到不确定,建议咨询有经验的系统管理员或更深入地了解相关文档和资源。

我怎么知道我MAC系统环境变量的路径呢?

您可以使用以下命令在终端上查看您的 macOS 系统环境变量的路径:

  1. 打开终端应用程序。
  2. 运行以下命令来显示当前的环境变量设置:
    printenv 这将显示当前的所有环境变量,其中包括您可能感兴趣的路径变量。
  3. 在输出的结果中,查找类似于以下的路径变量:
    PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin 这是 PATH 环境变量,它包含了系统用于查找可执行文件的一组目录路径。
  4. 通过查看 PATH 中的不同路径,您可以确定您的系统环境变量的路径。

在etc/sudoers 的 secure_path=后面,您可以添加可信任的路径,以确保只有在这些路径下的可执行文件才能被系统直接调用。一般来说,建议将系统的标准路径和您自己的自定义路径添加到secure_path中。

在您提供的环境变量中,您可以将以下路径添加到secure_path中:

secure_path="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home/bin:/Library/Java/JavaVirtualMachines/apache-maven-3.6.3/bin:/usr/local/mysql//bin:/Library/Tomcat/apache-tomcat-8.5.95/bin:/opt/homebrew/bin:/opt/homebrew/sbin"

请注意,这里只是一个示例。根据您自己的需求和系统配置,您可以根据需要自行调整和添加路径。

修改完secure_path后,请确保保存更改。这样,在使用类似sudo命令时,系统将只允许在secure_path中定义的路径下的可执行文件。

最后的最后,还是系统升级带来的锅。。。在etc/sudoers 的 secure_path= 后面把当前用户配置的环境变量路径加进去终于大功告成啦!

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值