我正在使用适用于 Linux 的 Microsoft Windows([版本 10.0.15063])子系统,并在 bash 中使用 Ranger 文件管理器打开文件时观察到意外行为。
例如,我将 ~/.config/rifle.conf 设置为在 Sublime Text 3 中打开 .txt 扩展名:
ext txt = "/mnt/c/Program Files/Sublime Text 3/sublime_text.exe" "$@"
当我按 Enter 打开包含数据的现有文本文件时,Sublime 确实打开该文件,但 Sublime 中显示的文件中没有实际的文本/数据。我可以关闭该文件并使用 Windows 文件资源管理器打开该文件,文本就在那里。
有趣的是,Sublime 看到的路径是“C\mnt\c\path\to\my\file.txt”。
这是 Windows 无法看到 /mnt 的问题吗?我希望能够在 WSL 上使用 Ranger 作为我的文件管理器,有没有人看到过这种行为并可能发现了修复方法?谢谢大家!
答案1
正如 laktak 所解释的,WSL 不会将文件路径从 Unix 路径转换为 Windows 路径。我刚刚写了一个要旨关于我如何处理这个问题,转载如下:
确保您拥有安装了 Windows 10 Fall Creators Update 的 WSL。 Ranger 用作rifle
文件处理程序,您需要它的配置文件rifle.conf
.如果您没有(应该在 中~/.config/ranger/rifle.conf
),请运行命令ranger --copy-config=rifle
,然后编辑生成的文件。
要从 Ranger 运行 Windows 应用程序,我们将使用cmd.exe /C start "" <file>
,它在秋季创意者更新之后运行。我们将通过使用sed
翻译路径来解决路径问题。
将以下代码添加到您的文件中rifle.conf
,您将能够运行所选文件扩展名的 Windows 应用程序。
ext docx?|xlsx?|pptx?|pdf = echo "$@" | sed -e 's;/mnt/\(.\);\1:;' -e 's/.*/"&"/' -e 's:/:\\:g' | xargs cmd.exe /C start ""
start
应该能够隐式运行与文件扩展名关联的应用程序,但如果由于某种原因它不起作用,您也可以显式地告诉start
要运行哪个可执行文件。只需删除并添加、、、等""
之一 。请注意,在这种情况下,每个应用程序都需要一行。举个例子:excel
winword
powerpnt
AcroRd32.exe
rifle.conf
ext docx? = echo "$@" | sed -e 's;/mnt/\(.\);\1:;' -e 's/.*/"&"/' -e 's:/:\\:g' | xargs cmd.exe /C start winword
ext xlsx? = echo "$@" | sed -e 's;/mnt/\(.\);\1:;' -e 's/.*/"&"/' -e 's:/:\\:g' | xargs cmd.exe /C start excel
补充阅读
答案2
WSL 不处理绝对路径转换 AFAIK
你可以
- 自己翻译路径(例如使用 bash 函数替换
/mnt/c/
为c:\
) - 或使用相对路径
答案3
要将 Linux 路径转换/mnt/c/Users/myusername/Desktop
为 Windows 路径,C:\Users\myusername\Desktop
必须执行三个步骤:
步骤1:在路径的开头和结尾附加双引号(对于空格来说是必需的):
sed -e 's;.*;"&";'
# s … substitute
# ; … delimiter character (can by any character)
# .* … any character `.` occurring any number of times `*` will be replaced by:
# " … at the beginning and " at the end.
第2步:替换/mnt/c/
为C:
:
sed -e 's;/mnt/c/;C:;'
# s … substitute field 1 `/mnt/c/` by field 2 `C:`
步骤3:将所有斜杠替换/
为反斜杠\
:
sed -e 's;/;\\;g'
# s … substitute field 1 `/` by field 2 `\`
# Note that there is a second `\` for escaping.
在 Linux 终端中测试所有三个部分:
echo '/mnt/c/Users/myusername/Desktop' | sed -e 's;.*;"&";' -e 's;/mnt/c/;C:;' -e 's;/;\\;g'
"C:Users\myusername\Desktop"
游骑兵使用步枪作为文件开启器。在我的本机 Linux 发行版上,我rifle.conf
只包含一行用于使用其默认应用程序启动所有文件类型:
else X, flag f = xdg-open "$@"
如果是 WSL,则如下所示:
cat << EOT >> ~/.config/ranger/rifle.conf
else X, flag f = echo "\$@" | sed -e 's;.*;"&";' -e 's;/mnt/c/;C:;' -e 's;/;\\\;g' | xargs cmd.exe /C start ""
EOT