我在 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 二进制文件。以这种方式运行的应用程序具有以下属性:
- 除下面解释的场景外,将工作目录保留为 WSL 命令提示符。
- 具有与bash.exe进程相同的权限。
- 以活动的 Windows 用户身份运行。
- 出现在 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