我可以在 Windows Subsystem for Linux (WSL) PATH 中创建指向 Windows 可执行文件的符号链接吗?

我可以在 Windows Subsystem for Linux (WSL) PATH 中创建指向 Windows 可执行文件的符号链接吗?

我在 Windows 上安装了 Android Studio 和 JDK 8,但我的 WSL 上没有 JDK cli。当我输入java或 时javac,找不到该命令。我按照建议这里java.exe现在我可以通过键入和来从 WSL 访问命令javac.exe,但我不想指定.exe扩展名。我的想法是添加一个指向可执行文件的符号链接,但不必指定可执行文件的路径(/mnt/c/...),因为这已经在 WSL PATH 中完成了。那么我可以创建一个指向 PATH 中某个位置的符号链接吗?如果这没有意义,这就是我尝试过的:

sudo ln -s -t java.exe java

我得到了"failed to access 'java.exe': No such file or directory"。然而这正是我想要实现的:指向 PATH 中可执行文件的符号链接,而无需指定可执行文件的实际路径,因为 PATH 已经有了。如果我疯了,这很愚蠢/不可能/没有必要,你可以说这是答案,我会接受它!:-D

答案1

您需要在可执行文件前加上其路径前缀。或者,您可以修改 LinuxPATH环境变量并附加 Windows 路径(以 为前缀/mnt/c/)。

从:Windows Subsystem for Linux 与 Windows 的互操作性

从 WSL 调用 Windows 二进制文件

Windows Subsystem for Linux 可以直接从 WSL 命令行调用 Windows 二进制文件。以这种方式运行的应用程序具有以下属性:

  1. 除下面解释的场景外,将工作目录保留为 WSL 命令提示符。
  2. 具有与bash.exe进程相同的权限。
  3. 以活动的 Windows 用户身份运行。
  4. 出现在 Windows 任务管理器中,就像直接从 CMD 提示符执行一样。

例子:

$ /mnt/c/Windows/System32/notepad.exe

在 WSL 中,这些可执行文件的处理方式与原生 Linux 可执行文件类似。这意味着将目录添加到 Linux 路径和命令之间的管道传输将按预期工作。示例:

$ export PATH=$PATH:/mnt/c/Windows/System32
$ notepad.exe
$ ipconfig.exe | grep IPv4 | cut -d: -f2
$ ls -la | findstr.exe foo.txt
$ cmd.exe /c dir

Windows 二进制文件必须包含文件扩展名、文件大小写匹配且可执行。非可执行文件(包括批处理脚本和类似命令)dir可以使用命令运行/mnt/c/Windows/System32/cmd.exe /C

例子:

$ /mnt/c/Windows/System32/cmd.exe /C dir
$ /mnt/c/Windows/System32/PING.EXE www.microsoft.com

参数未经过修改就传递给 Windows 二进制文件。

即使在 Linux 中,符号链接也包含路径。例如以下命令:

$ ls -la /bin | grep ^l
(...SNIP...)
lrwxrwxrwx  1 root root      20 Jun 27 09:49 systemd -> /lib/systemd

systemd链接到/lib/systemd/systemd。因此您的符号链接:

sudo ln -s -t java.exe java

我想象(因为我不是链接专家)需要看起来像这样:

sudo ln -s -t /mnt/c/Windows/Path/To/java.exe java

使用alias而不是符号链接

我不用符号链接,而是在文件中创建一个别名,~/.bashrc如下所示:

alias java='/mnt/c/WindowsPathTo/java.exe'

然后,无论何时您输入,java系统都会为您输入胡言乱语。传递的任何参数都会被接受。

答案2

我正在使用 Fish-Shell,发现别名和符号链接实际上都不起作用。我不确定这是否是 fish 的问题,我更怀疑 Windows 奇怪的路径命名是问题所在。

我的解决方案是向 fish.config 添加一个函数(相当于 .bashrc)

function npp
    "/mnt/c/Program Files (x86)/Notepad++/notepad++.exe" $argv
end

fish 中的 ($argv 相当于 bash 中的 $*)

然后我可以通过以下方式调用 Notepad++:npp test.txt

相关内容