mar*_*2x4 3 terminal powershell node.js snowflake-cloud-data-platform windows-subsystem-for-linux
我启动并运行了 WSL2。在 Windows 级别我安装了 node.js,现在我想npm install snowflake-sdk
从 Ubuntu 级别运行。-bash: /mnt/c/Program Files/nodejs/npm: /bin/sh^M: bad interpreter: No such file or directory
当 PowerShell 工作正常时终端返回。
问题是:是否可以使用 WSL2 的终端与 Windows 级别安装的应用程序进行交互?
笔记:
npm
在Linux中,按照官方的说明谢谢,SeaDude。如果您随后需要从 Windows调用,则可以使用wsl npm ...
,但请注意,在 WSL2中通常不鼓励跨文件系统调用。harzvor 的有用回答提供了很好的背景信息。
这是可能使呼叫npm
从一个安装的Windows Node.js的复制从WSL2工作,虽然不是很明显,并有点麻烦-尽管你可以在自定义函数或脚本包裹的解决方法:
# From WSL2; note the required use of '.exe'
node.exe 'c:/Program Files/nodejs/node_modules/npm/bin/npm-cli.js' install snowflake-sdk
Run Code Online (Sandbox Code Playgroud)
以上,这依赖于Node.js的被安装在Windows上的默认位置,来电npm
间接,使用基本相同的技术,它的CLI入口点在Windows上,该npm.cmd
批处理文件,应用。
笔记:
为了靶向的Windows从WSL可执行文件,您必须包括文件扩展名明确,如node.exe
不是node
。
如果没有它,例如使用npm
,Linux 子系统将在文件夹中查找具有该名称的无扩展名$PATH
文件,这将不起作用。
即使在 Windows 上也确实存在这样的文件,但它是为类 Unix平台设计的基于 shebang 的脚本,基本上只是 Windows 安装中的重担;Linux 子系统仍然尝试执行它,但失败了,因为它使用 CRLF ( \r\n
) 换行符而不是预期的 LF-only ( \n
) 换行符。因此,后面的意外 CR #!/bin/sh
(^M
在错误消息中表示)被视为可执行路径的一部分,因此调用失败。[1]
然而,即使手动修复该问题(转换为仅 LF 换行符)也无济于事,因为 shell 脚本如何构造npm-cli.js
入口点的完整路径:它将其表示为试图针对 Windows 文件的 UNC 路径 -通过 WSL 文件系统定位系统- 例如
\\wsl$\Ubuntu-20.04\mnt\c\...
- 这是明确禁止的。[2]
显式调用批处理文件npm.cmd
也不起作用 - 无论是直接调用还是使用cmd.exe /c npm.cmd ...
:
*.cmd
文件的直接调用失败了 - 不确定这是否是 Windows 10 20H2 的错误。cmd.exe /c
它也失败了,因为cmd.exe
不支持 UNC 路径作为当前目录,并且 WSL2 内部当前目录路径总是表示为一个(例如,\\wsl$\Ubuntu-20.04\home\jdoe\project\some-project
)。在这种情况下cmd.exe
默认为Windows 目录,因此将包安装到当前 WSL 目录(的项目)将不起作用)。向 npm CLI 的主.js
文件提供完整的 Windows 本地路径 to node.exe
,如上所示,按预期工作,因为 Node.js 似乎正在处理引用WSL2 文件系统目录和文件的UNC 路径,例如调用 WSL2 shell 当前目录,正确。
[1] 在 Ubuntu 20.04 上,shebang 行中的 CR本身似乎不再是问题,但是其余行中的 CR 仍然存在,因此调用仍然失败,更隐晦的是,出现了诸如: not foundram Files/nodejs/npm: 3:
.
[2] 原因是 Linuxdirname
实用程序用于确定 shell 脚本自己的目录以确定npm-cli.js
的完整路径,并且该实用程序设计为从Linux文件系统的角度运行,最终表达脚本的以这种间接的、不受支持的方式定位Windows文件系统。
归档时间: |
|
查看次数: |
704 次 |
最近记录: |