使用 WSL2 与 Windows 上安装的应用交互
Interact with apps installed on Windows using WSL2
我启动了 WSL2 并 运行ning。在 Windows 级别我安装了 node.js,现在我想从 Ubuntu 级别 运行 npm install snowflake-sdk
。终端 returns -bash: /mnt/c/Program Files/nodejs/npm: /bin/sh^M: bad interpreter: No such file or directory
而 PowerShell 工作正常。
问题是:是否可以使用 WSL2 的终端与 Windows 级别安装的应用程序进行交互?
> 是否可以使用 WSL2 的终端与 Windows 级别安装的应用程序进行交互?
是的,您可以从 WSL 运行 notepad.exe
,它会在 Windows.
中打开记事本
更多文档:https://docs.microsoft.com/en-us/windows/wsl/interop#run-windows-tools-from-linux
解决 NPM 问题
如果我在 WSL 中尝试 运行ning npm -v
,我会收到有关无法找到文件的错误消息:
PS C:\Users\harvey> bash
harvey@harvey-w10x64-defiance:/mnt/c/Users/harvey$ npm -v
internal/modules/cjs/loader.js:968
throw err;
^
Error: Cannot find module 'C:\mnt\c\Program Files\nodejs\node_modules\npm\bin\npm-cli.js'
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:965:15)
at Function.Module._load (internal/modules/cjs/loader.js:841:27)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
at internal/main/run_main_module.js:17:47 {
code: 'MODULE_NOT_FOUND',
requireStack: []
}
文件的路径大部分是正确的,但它附加了 C:\mnt
。
我通过 运行ning npm
给 Node npm-cli.js
文件的路径解决了这个问题。
你可以运行:
node.exe \c\Program Files\nodejs\node_modules\npm\bin\npm-cli.js -v
但是 运行 出现了同样的错误。
然后我尝试了这个:
PS C:\Users\harvey> bash
harvey@harvey-w10x64-defiance:/mnt/c/Users/harvey$ cd "/mnt/c/Program Files/nodejs/node_modules/npm/bin"
harvey@harvey-w10x64-defiance:/mnt/c/Program Files/nodejs/node_modules/npm/bin$ ../../../node.exe npm-cli.js -v
6.14.6
从这里我终于能够从 NPM CLI 获得一些输出。
我可以从这里安装包,但它可能会安装在错误的位置。
我似乎无法 npm
在文件系统的任何地方工作。这可能是 NPM 的限制。也许如果你尝试弄乱你的路径环境变量,你可以让它工作吗?
注:
- 比较典型的场景是在Linux端安装Node.js和
npm
,根据 the official instructionsThanks, SeaDude。 如果您需要从 Windows 调用 ,您可以使用
wsl npm ...
,但请注意 cross-file-system 调用是 generally discouraged in WSL2。
提供了很好的背景信息。
可以从Windows-installed调用npm
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
以上内容依赖于 Node.js 安装在 Windows 上的默认位置,调用 npm
间接 ,基本上使用Windows 上的 CLI 入口点 、npm.cmd
批处理文件 使用的相同技术。
注:
为了从 WSL 定位 Windows 可执行文件,您必须包含文件扩展名 显式 ,例如 node.exe
而不是 node
.
没有它,例如对于 npm
,Linux 子系统在 $PATH
文件夹中查找具有该名称的 extension-less 文件,这 不工作。
这样的文件实际上确实甚至在Windows上也存在,但它是为[=67=设计的shebang-based脚本]Unix-like 平台,基本上只是 Windows 安装中的自重; Linux 子系统仍然尝试执行它,但失败了,因为它使用 CRLF (\r\n
) 换行符而不是预期的 LF-only (\n
) 换行符。结果, #!/bin/sh
之后的意外 CR(在错误消息中表示为 ^M
)被认为是可执行路径 的一部分 ,因此调用失败.[1]
即使手动修复该问题(转换为 LF-only 换行符)也无济于事,但是,因为 shell 脚本如何构建完整的npm-cli.js
入口点 的路径:它表示为尝试通过 WSL [=173] Windows file-system 位置 的 UNC 路径=] - 例如,
\wsl$\Ubuntu-20.04\mnt\c\...
- 明确不允许。[2]
调用 batch 文件,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-native 路径提供给 node.exe
,如上所示,按预期工作,因为 Node.js 似乎以其他方式处理引用 WSL2 file-system 目录和文件的 UNC 路径,例如调用 WSL2 的 shell 当前目录,正确。
[1] 在 Ubuntu 20.04 上,shebang 行本身 中的 CR 似乎不再是问题,但是剩余的行仍然是,所以调用仍然失败,甚至更模糊,错误消息如 : not foundram Files/nodejs/npm: 3:
.
[2] 原因是 Linux dirname
实用程序用于确定 shell 脚本自己的目录,以便确定 npm-cli.js
的完整路径,此实用程序设计为从 Linux file-system 的角度运行,最终表达脚本的 Windows file-system 以这种间接、不受支持的方式定位。
我启动了 WSL2 并 运行ning。在 Windows 级别我安装了 node.js,现在我想从 Ubuntu 级别 运行 npm install snowflake-sdk
。终端 returns -bash: /mnt/c/Program Files/nodejs/npm: /bin/sh^M: bad interpreter: No such file or directory
而 PowerShell 工作正常。
问题是:是否可以使用 WSL2 的终端与 Windows 级别安装的应用程序进行交互?
> 是否可以使用 WSL2 的终端与 Windows 级别安装的应用程序进行交互?
是的,您可以从 WSL 运行 notepad.exe
,它会在 Windows.
更多文档:https://docs.microsoft.com/en-us/windows/wsl/interop#run-windows-tools-from-linux
解决 NPM 问题
如果我在 WSL 中尝试 运行ning npm -v
,我会收到有关无法找到文件的错误消息:
PS C:\Users\harvey> bash
harvey@harvey-w10x64-defiance:/mnt/c/Users/harvey$ npm -v
internal/modules/cjs/loader.js:968
throw err;
^
Error: Cannot find module 'C:\mnt\c\Program Files\nodejs\node_modules\npm\bin\npm-cli.js'
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:965:15)
at Function.Module._load (internal/modules/cjs/loader.js:841:27)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
at internal/main/run_main_module.js:17:47 {
code: 'MODULE_NOT_FOUND',
requireStack: []
}
文件的路径大部分是正确的,但它附加了 C:\mnt
。
我通过 运行ning npm
给 Node npm-cli.js
文件的路径解决了这个问题。
你可以运行:
node.exe \c\Program Files\nodejs\node_modules\npm\bin\npm-cli.js -v
但是 运行 出现了同样的错误。
然后我尝试了这个:
PS C:\Users\harvey> bash
harvey@harvey-w10x64-defiance:/mnt/c/Users/harvey$ cd "/mnt/c/Program Files/nodejs/node_modules/npm/bin"
harvey@harvey-w10x64-defiance:/mnt/c/Program Files/nodejs/node_modules/npm/bin$ ../../../node.exe npm-cli.js -v
6.14.6
从这里我终于能够从 NPM CLI 获得一些输出。
我可以从这里安装包,但它可能会安装在错误的位置。
我似乎无法 npm
在文件系统的任何地方工作。这可能是 NPM 的限制。也许如果你尝试弄乱你的路径环境变量,你可以让它工作吗?
注:
- 比较典型的场景是在Linux端安装Node.js和
npm
,根据 the official instructionsThanks, SeaDude。 如果您需要从 Windows 调用 ,您可以使用
wsl npm ...
,但请注意 cross-file-system 调用是 generally discouraged in WSL2。
可以从Windows-installed调用npm
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
以上内容依赖于 Node.js 安装在 Windows 上的默认位置,调用 npm
间接 ,基本上使用Windows 上的 CLI 入口点 、npm.cmd
批处理文件 使用的相同技术。
注:
为了从 WSL 定位 Windows 可执行文件,您必须包含文件扩展名 显式 ,例如
node.exe
而不是node
.没有它,例如对于
npm
,Linux 子系统在$PATH
文件夹中查找具有该名称的 extension-less 文件,这 不工作。这样的文件实际上确实甚至在Windows上也存在,但它是为[=67=设计的shebang-based脚本]Unix-like 平台,基本上只是 Windows 安装中的自重; Linux 子系统仍然尝试执行它,但失败了,因为它使用 CRLF (
\r\n
) 换行符而不是预期的 LF-only (\n
) 换行符。结果,#!/bin/sh
之后的意外 CR(在错误消息中表示为^M
)被认为是可执行路径 的一部分 ,因此调用失败.[1]即使手动修复该问题(转换为 LF-only 换行符)也无济于事,但是,因为 shell 脚本如何构建完整的
npm-cli.js
入口点 的路径:它表示为尝试通过 WSL [=173] Windows file-system 位置 的 UNC 路径=] - 例如,
\wsl$\Ubuntu-20.04\mnt\c\...
- 明确不允许。[2]
调用 batch 文件,
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-native 路径提供给node.exe
,如上所示,按预期工作,因为 Node.js 似乎以其他方式处理引用 WSL2 file-system 目录和文件的 UNC 路径,例如调用 WSL2 的 shell 当前目录,正确。
[1] 在 Ubuntu 20.04 上,shebang 行本身 中的 CR 似乎不再是问题,但是剩余的行仍然是,所以调用仍然失败,甚至更模糊,错误消息如 : not foundram Files/nodejs/npm: 3:
.
[2] 原因是 Linux dirname
实用程序用于确定 shell 脚本自己的目录,以便确定 npm-cli.js
的完整路径,此实用程序设计为从 Linux file-system 的角度运行,最终表达脚本的 Windows file-system 以这种间接、不受支持的方式定位。