Javascript 节点子进程试图使用/usr/bin/zsh,但失败,因为它不存在
自最近以来,许多npm命令对我来说都失败了,错误消息与此类似:Javascript 节点子进程试图使用/usr/bin/zsh,但失败,因为它不存在,javascript,node.js,npm,zsh,Javascript,Node.js,Npm,Zsh,自最近以来,许多npm命令对我来说都失败了,错误消息与此类似: npm ERR! code ELIFECYCLE npm ERR! syscall spawn /usr/bin/zsh npm ERR! file /usr/bin/zsh npm ERR! path /usr/bin/zsh npm ERR! errno ENOENT npm ERR! myProj@0.1.0 preinstall: `npm run myCommand` npm ERR! spawn /usr/bin/zsh
npm ERR! code ELIFECYCLE
npm ERR! syscall spawn /usr/bin/zsh
npm ERR! file /usr/bin/zsh
npm ERR! path /usr/bin/zsh
npm ERR! errno ENOENT
npm ERR! myProj@0.1.0 preinstall: `npm run myCommand`
npm ERR! spawn /usr/bin/zsh ENOENT
npm ERR!
npm ERR! Failed at the myProj@0.1.0 preinstall script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
到目前为止,我发现这个错误可能是由/usr/bin/zsh
不存在引起的。zsh位于我的系统上的/bin/zsh
下
导致此错误的脚本内容是:
const { exec } = require('child_process');
exec('npm -v', (err, stdout) => {
if (err) throw err;
if (parseFloat(stdout) < 5) {
// NOTE: This can happen if you have a dependency which lists an old version of npm in its own dependencies.
throw new Error(`[ERROR] You need npm version @>=5 but you have ${stdout}`);
}
});
所以最有可能的child_进程正在尝试调用/usr/bin/zsh。但我不知道为什么以及如何解决这个问题。有什么想法吗
这个问题似乎与此类似:
完全重新安装节点、npm和nvm没有帮助。使用纱线时也会发生错误
另一个调试问题:
我在任何地方都找不到internal/child\u process.js
或internal/process/next\u tick.js
编辑:我发现,无论运行的脚本如何,这个错误都会引起关注
如果我运行一个脚本
npm run x
,它在package.json中定义为“x”=“npm run y”
。这将失败。但是如果我直接运行npm run y,它就会工作。我现在已经覆盖了两个OSX安全措施来解决这个问题:
csrutil disable
ln-s/usr/bin/zsh/bin/zsh
现在错误消失了。但其原因和正确的修复仍然未知不是正确的解决方案,但您可以尝试将zsh二进制文件符号链接到
/usr/bin/zsh
安装代码时是否存在/usr/bin/zsh
?安装程序可能已修改脚本以使用硬编码路径。代码应该依赖于路径查找,或者在已知位置安装自己的依赖项,尽管.afaik它从未存在过。而且,通过禁用某些osx安全措施,不仅可以在该位置进行符号链接。不幸的是,即使禁用osx安全功能,我仍然从节点文档中得到“ln:/usr/bin/zsh:Read-only file system:“生成一个shell,然后在该shell中执行命令,缓冲所有生成的输出。”关于shell选项:“默认:'/bin/sh'on Unix”。看看/bin/sh
指向什么。
17 verbose stack spawn /usr/bin/zsh ENOENT
17 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:240:19)
17 verbose stack at onErrorNT (internal/child_process.js:415:16)
17 verbose stack at process._tickCallback (internal/process/next_tick.js:63:19)