使用 WSL2 与安装在 Windows 上的应用程序交互

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 级别安装的应用程序进行交互?

mkl*_*nt0 6

笔记:

  • 更典型的情况是安装的Node.js和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文件系统。