Функция для открытия произвольной программы из терминала WSL

#bash #windows-subsystem-for-linux

#bash #windows-subsystem-for-linux

Вопрос:

У меня возникли проблемы с написанием программы, которая принимает /path/to/file в среде WSL Ubuntu и открывает этот файл в программе Windows по умолчанию. Самой большой проблемой здесь является преобразование /path/to/file/for/WSL в pathtofileforwindows . Это то, что я написал и поместил в свой .bashrc файл:

 # Function to get open-wsl to work  
  function open-from-wsl() {  
          echo "opening"  
          cmd_directory = echo "$1" | sed 's/^///' | sed 's///\/g' | sed 's/^...../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
  

Я буду file.PDF открывать ее в программе просмотра PDF по умолчанию. Однако на данный момент я получаю сообщение об ошибке cmd_directory: command not found , а затем открывается окно командной строки. Это, конечно, пишется для того, чтобы я мог открыть любой файл из WSL и открыть его в программе по умолчанию, это относится не только к PDF-файлам.

РЕДАКТИРОВАТЬ: я скорректировал код таким образом благодаря вводу Socowi:

 # Function to get open-wsl to work  
  function open-from-wsl() {  
          echo "opening"
          cmd_directory=$(echo "$1" | sed 's###')  
          cmd_directory=$(echo "$cmd_directory" | sed 's/^///' | sed 's///\/g' | sed 's/^...../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 "$1" | sed 's###')
  

Комментарии:

1. Удалите пробелы вокруг = и инкапсулируйте echo ... | sed ... | ... в $() .

2. У меня создалось впечатление, что wslpath использует только пути Windows и преобразует их в путь Ubuntu

Ответ №1:

Гораздо более простым решением является создание файла в /usr / bin/ с именем v (v для просмотра, мне нравятся короткие команды, но вы можете называть это как угодно), содержащего следующее:

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

Теперь, предполагая, что /usr /bin находится в пути wsl, просто вызовите v foo.txt , чтобы открыть файл в редакторе Windows по умолчанию.

wslpath используется для преобразования пути wsl в путь dos. Теперь это включено в установку wsl (ссылка)

Ответ №2:

После поиска среди различных вопросов, относящихся к смежным проблемам. Я, наконец, нашел решение. В итоге я поместил эту функцию в свой .bashrc файл:

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

Это позволит вам открыть любой файл на вашем компьютере (при условии, что вы знаете путь к нему по WSL) в программе Windows по умолчанию.