我启动并运行了 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 端 ,根据 the official instructions谢谢,SeaDude .如果您需要从 Windows 调用,您可以使用wsl npm ...
,但请注意 跨文件系统调用是 generally discouraged in WSL2 . harzvor's helpful answer提供了很好的背景信息。
可以调用
npm
来自 WSL2 工作的 Windows 安装的 Node.js 副本,虽然它不明显且有点麻烦 - 虽然 您可以将解决方法包装在自定义函数或脚本中 :# From WSL2; note the required use of '.exe'
node.exe 'c:/Program Files/nodejs/node_modules/npm/bin/npm-cli.js' install snowflake-sdk
上述依赖于安装在 Windows 上默认位置的 Node.js,调用 npm
间接地,使用与 Windows 上的 CLI 入口点基本相同的技术,npm.cmd
批处理文件,使用。笔记:
node.exe
而不是 node
.npm
,Linux 子系统会在 $PATH
中查找具有该名称的无扩展名文件。文件夹,这不起作用。\r\n
) 换行符而不是预期的 LF-only ( \n
) 换行符。结果,#!/bin/sh
后面的意外CR (在错误消息中表示为 ^M
)被认为是可执行路径的一部分,因此调用失败。 [1]npm-cli.js
的完整路径入口点:它将它表示为一个 UNC 路径,该路径尝试通过 WSL 文件系统定位 Windows 文件系统位置 - 例如,\\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 目录(的项目)将不起作用)。 .js
文件到 node.exe
,如上所示,按预期工作 ,因为 Node.js 似乎正在处理引用 WSL2 文件系统目录和文件的 UNC 路径,例如调用 WSL2 的 shell 当前目录。[1] 在Ubuntu 20.04上,shebang行中的CR本身似乎不再是问题,但其余行中的CR仍然存在,因此调用仍然失败,更隐晦的是,出现了诸如
: not foundram Files/nodejs/npm: 3:
之类的错误信息。 .[2] 原因是Linux
dirname
实用程序用于确定shell脚本自己的目录以确定npm-cli.js
的完整路径,并且此实用程序设计为从 Linux 文件系统的角度运行,最终以这种间接的、不受支持的方式表达脚本的 Windows 文件系统位置。
关于node.js - 使用 WSL2 与安装在 Windows 上的应用程序交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64742172/