从WSL终端打开任意程序的功能

Function to Open Arbitrary Program from WSL terminal

我在编写一个在 WSL Ubuntu 环境中获取 /path/to/file 并在其默认 Windows 程序中打开该文件的程序时遇到问题。这里最大的问题是将 /path/to/file/for/WSL 转换为 path\to\file\for\windows。这是我写并放入我的 .bashrc 文件中的内容:

# Function to get open-wsl to work  
  function open-from-wsl() {  
          echo "opening"  
          cmd_directory = echo "" | sed 's/^\///' | sed 's/\//\/g' | sed 's/^...../[=10=]C:/' | sed 's/^\mnt//'  
          cmd_directory = echo "$cmd_directory" | sed 's/^..//'  
          cmd.exe /C start $cmd_directory  
  }

理想情况下,如果我输入 :

open-from-wsl /mnt/c/Users/DavidG/Google\ Drive/folder/file.PDF

我将在我的默认 PDF 查看器中打开 file.PDF。然而,截至目前,我收到错误 cmd_directory: command not found,然后我的命令提示符 window 打开。这当然是为了让我可以从 WSL 打开任何文件并在它的默认程序中打开它,它不仅仅适用于 PDF。

编辑:由于 Socowi 的输入,我已经像这样调整了代码:

# Function to get open-wsl to work  
  function open-from-wsl() {  
          echo "opening"
          cmd_directory=$(echo "" | sed 's#\##')  
          cmd_directory=$(echo "$cmd_directory" | sed 's/^\///' | sed 's/\//\/g' | sed 's/^...../[=12=]C:/' | sed 's/^\mnt//')  
          cmd_directory=$(echo "$cmd_directory" | sed 's/^..//')  
          cmd.exe /C start $cmd_directory  
  }

我现在的问题似乎是我无法从 /mnt/c/Users/DavidG/Google\ Drive/folder/file.PDF 中删除 \,这是我添加行

的目标
cmd_directory=$(echo "" | sed 's#\##')

在搜索了与相邻问题有关的各种问题之后。我终于找到了解决方案。这是我最终放入 .bashrc 文件的函数:

# Function to get open an arbitrary file in its default Windows program
function open-from-wsl() {
     echo "opening"
     cmd_directory=$(echo "" | sed 's#[\]##')
     cmd_directory=$(echo "$cmd_directory" | sed 's/^\///' | sed 's/\//\/g' | sed 's/^...../[=10=]C:/' | sed 's/^\mnt//')
     cmd_directory=$(echo "$cmd_directory" | sed 's/^..//')
     echo "$cmd_directory"
     cmd.exe /C start ""  "$cmd_directory"
}

这将允许您在计算机的默认 Windows 程序中打开任何文件(假设您知道它的 WSL 路径)。

一个更简单的解决方案是在 /usr/bin/ 中创建一个名为 v 的文件(v 用于查看,我喜欢简短的命令,但你可以随意命名它)包含以下内容:

cmd.exe /C start $(wslpath -w "$(pwd)/")

现在假设 /usr/bin 在 wsl 路径中,只需调用 v foo.txt 在其默认 windows 编辑器中打开文件。

wslpath is used to convert the wsl path to a dos path. This is now included in the wsl install (link)