如何让类似 Unix 的路径在 Windows 上的 Bash 中正常工作?

如何让类似 Unix 的路径在 Windows 上的 Bash 中正常工作?

对于那些不熟悉系统管理软件,它是 *nix 程序到 Windows 的移植。在那里,我可以做如下事情:

$ some-prog ~/.profile
$ some-prog /c/Windows/System32/drivers/etc/hosts

some-prog可以是任何二进制文件,无论它们是一般的 Windows 程序还是使用 msys2 中的编译器编译的程序。路径将被透明地转换,因此即使在使用不属于 msys2 的程序时也能给人一种非常 *nix 的感觉。

目前,我正在检查 WSL/“Windows 上的 Bash”(Creators Update),但似乎遇到了一个问题。

对于 Linux 程序来说,一切正常:

~ $ nano ~/.

正如预期的那样,nano 打开时显示的是 的内容~/.profile

但是,当尝试调用 Windows 程序时,出现错误:

~ $ "/mnt/c/Program Files/Sublime Text 3/subl.exe" ~/.profile
Unable to translate current working directory. Using C:\Users\Admin

它在 Sublime Text 中打开C:\home\<wsl_username>\.profile,而实际文件应该是%localappdata%\lxss\home\<wsl_username>\.profile

Windows 路径也不太好:

~ $ "/mnt/c/Program Files/Sublime Text 3/subl.exe" /mnt/c/Windows/System32/drivers/etc/hosts
Unable to translate current working directory. Using C:\Users\Admin

这又打开了C:\mnt\c\Windows\System32\drivers\etc\hosts一条错误的道路。

有没有办法可以在 WSL 上实现正确的、类似 msys2 的路径集成?

答案1

你需要一些类似cygpathCygwin 的东西,不幸的是,目前还没有将其移植到 WSL...然后你就可以运行:

cd /
notepad.exe $(cygpath /etc/hosts)

目前,最接近的替代品cygpath是在 redit 上发布的小程序,名为执行程序

作为另一个参考,您可以看到 Atom(文本编辑器)在其最新版本中包含的 shell 脚本,原子脚本

或者如果你想使用 nodejs并且不介意对你的用户名进行硬编码,你可以写:

var p = require("path")
var path = "C:\\Users\\me\\Desktop"
var sepa = path.split(p.win32.sep)
var newS = [].concat([sepa[0].toLowerCase()], sepa.slice(1))
var newP = "/mnt/" + p.posix.join.apply(p.posix, newS).replace(":", "")
// newP == "/mnt/c/Users/me/Desktop

目前,最简单的解决方法是确保您要使用的 Windows 二进制文件在您的路径中(您甚至可以使用 .exe 的符号链接来保持路径清洁),然后 cd 到 /mnt/c/PathToFileYouWantToEdit,然后像这样运行您的程序:atom.exe myExampleFile

cd /mnt/c/Some/Path
notepad.exe SomeFile

如果您的目标是编辑 WSL 内部但外部无法访问的文件(WSL 的 /mnt 之外的所有内容),那么最简单的方法是在 WSL 内部安装一个 WebDAV 服务器,允许对 / 进行读/写访问,并将该 WebDAV 服务器映射到 Windows 驱动器号。

相关内容