Как я могу "открыть" файл из WSL с помощью приложения по умолчанию?

Большинство систем обеспечивают open команда (поочередно известная как start, cygstart, xdg-open и т. д.), который открывает файл в приложении "по умолчанию" среды рабочего стола, что бы это ни было.

Например, из Powershell, когда я вхожу:

PS> start form.pdf

Документ открывается в Edge.

Может ли Bash-on-Ubuntu-on-Windows сделать это?

16 ответов

Решение

Так как взаимодействие Windows Linux начало работать, теперь вы можете позвонить:

cmd.exe /C start <file>

Недавний ответ для WSL 2: просто сделайте wslview slides.pdf.

Это часть коллекции wslu, которая была предустановлена ​​в моем Ubuntu. К сожалению, документации немного.

Все cmd.exe варианты не работали для меня, потому что он не хочет открываться внутри пути, например \\wsl$\…

Как отметил Мартейн, это правильный способ запуска / открытия приложения / файла Windows.

cmd.exe /C start <file>

Я нашел очень полезным преобразовать это в скрипт bash, который я храню в папке, которая находится в моем системном пути. Я называю это start и делай chmod 0744 в файл, чтобы сделать его исполняемым. $* означает, что он передаст все аргументы командной строки, которые вы предоставили скрипту cmd.exe,

#!/bin/bash
cmd.exe /c start $*

С помощью этой команды в моем системном пути я могу использовать такие команды в Linux, которые открываются в Windows:

  1. start FileXYZ.pdf // Открывает PDF в программе просмотра PDF, назначенной по умолчанию в Windows
  2. start explorer . // Открывает текущую папку WSL в проводнике Windows
  3. start MyApp.exe // Запускает приложение Windows

Чтобы расширить ответ Martijn, вы можете поставить

alias start='cmd.exe /C start'

в вашем.bashrc, чтобы получить ожидаемое поведение Windows, например start . открывает проводник в текущем каталоге.

У меня это сработало намного лучше:

explorer.exe `wslpath -aw <path>`

Это зависит от того, хотите ли вы A) запустить программу linux внутри WSL или B) вы хотите запустить программу windows из командной строки bash.

Если Б), то да, если вы устанавливаете Cygwin / Bash. Например, установите Git для Windows, и у вас есть система, работающая под Windows с Bash. Затем вы можете просто запустить start, на самом деле он включен как скрипт:

$ cat /usr/bin/start
#!/usr/bin/env bash
# Copyright (C) 2014, Alexey Pavlov
#   mailto:alexpux@gmail.com
# This file is part of Minimal SYStem version 2.
#   https://sourceforge.net/p/msys2/wiki/MSYS2%20installation/
# File: start

cmd //c start "${@//&/^&}"

Если A), то это становится намного сложнее, особенно если вы хотите запустить программу linux для отображения.pdf в окне GUI. Обратите внимание, что Windows знает, как связать приложение по умолчанию для открытия PDF-файла, но WSL не имеет этой информации. Поэтому, даже если у вас есть рабочий стол, работающий под WSL, вам нужно будет связать приложение Linux с графическим интерфейсом, чтобы открыть PDF-файл.

Обратите внимание, что в WSL вы выполняете исполняемые файлы Linux, а не Windows:

(WSL):~# file /bin/gzip
/bin/gzip: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=68cc3c090405cf6d40e97d2ff58085fd26940602, stripped

(WSL):~# file /mnt/c/Program\ Files/Internet\ Explorer/iexplore.exe
 /mnt/c/Program Files/Internet Explorer/iexplore.exe: PE32+ executable (GUI) x86-64, for MS Windows

(WSL):~# /mnt/c/Program\ Files/Internet\ Explorer/iexplore.exe
 bash: /mnt/c/Program Files/Internet Explorer/iexplore.exe: cannot execute binary file: Exec format error

Лучший и простой способ открыть файлы с помощью приложения по умолчанию — использоватьесли у вас есть WSL.

$explorer.exe <file>:

$explorer.exe form.pdf: эта командная строка использует проводник Windows для открытия файла с помощью программы по умолчанию.

Сexplorer.exeвы также можете открыть папку в своем WSL с помощью проводника Windows , просто вместо использования файла в качестве параметра вы можете указать каталог:

$explorer.exe <directory>:

$explorer.exe .: открывает проводник Windows в текущем местоположении.

Вы можете назвать Powershell Start-Process команда из WSL:

powershell.exe -Command Start-Process file

Чтобы это также работало с абсолютными путями, вы можете использовать wslpath -wa команда для преобразования пути в путь к Windows.

powershell.exe -Command Start-Process `wslpath -wa /absolute/path/to/file`

Это имеет преимущество перед cmd.exe решение: для смонтированных сетевых ресурсов, wslpath создает путь UNC, например \\server\share\. Эти UNC-пути не могут быть обработаны cmd.exe.

Основываясь на идее, предложенной @zx485 и @Nullcito здесь , вы можете использовать это:

      function start() {
  cmd.exe /C start "$(wslpath -wa $1)" /C bash
}

Вам просто нужно передать файл, и он преобразуется в правильный путь Windows.

Я обнаружил, что explorer.exe очень хорошо работает для поиска правильного разрешенного пути (даже для подключенных сетевых каталогов) и запуска инструмента по умолчанию. Единственный недостаток в том, что у вас не может быть путей в имени файла, поэтому вам нужно создать небольшую вспомогательную функцию / скрипт для корректного запуска проводника, например:

win() { 
    # get full unsymlinked filename 
    file=`readlink -e $1` 
    dir=$(dirname "$file") 
    base=$(basename "$file") 
    # open item using default windows application 
    (cd "$dir"; explorer.exe "$base")
}

eopen может открывать различные файлы (каталоги и URI) в WSL.

https://github.com/ko1nksm/eopen-ecd

Примеры

# Open directory with (latest used) Explorer
eopen ~/.config/

# Open directory with new instance of Explorer
eopen -n ~/.config/

# Opens with Windows default application
eopen image.png

# Opens with Windows text editor
eopen -e ~/.bashrc

# Use sudo to edit the unowned file
eopen -e --sudo /etc/hosts

# Opens with Windows default browser
eopen http://google.com

# Open files and directories under Windows
eopen C:/Windows

# Open files and directories under Network shared folder
eopen //server/shared

# Others
eopen mailto:user@example.com   # Mail protocol
eopen calculator:               # Application
eopen shell:Personal            # Shell commands
eopen :MyComputerFolder         # Shorthand for shell:
eopen shell:::{2559a1f8-21d7-11d4-bdaf-00c04f60b9f0} # CLSID
eopen :                         # Current Explorer location
eopen :/workspace               # Relative path from current Explorer location

Попробуй это:

function open {
  cmd.exe /C start "$1" /C bash
}

Если вы хотите, чтобы он работал каждый раз, просто добавьте его в .bashrc:
введите описание ссылки здесь

Если у вас установлен fzf , вы можете добавить следующую функцию в свой.bashrcчтобы использовать его для нечеткого поиска и запуска приложения Windows по выбранному вами пути:

      function open() {
  INPUT=$(fzf --preview 'bat --color=always {}' --preview-window=right:50%)
  # Check for path before launching, in case fzf invocation was cancelled
  if [[ -e $INPUT ]] ; then
    cmd.exe /C start $(echo $INPUT)
  fi
}

Команда fzf также ссылается на bat для подсветки синтаксиса на панели предварительного просмотра.Если у вас нетbatустановлен, просто замените'bat --color=always {}'с'cat {}'вместо. ifусловный используется для проверки пустого пути, чтобыcmd.exeне появится, если вы запуститеfzfа затем выйти из него, не выбирая путь.

xdg-openв Ubuntu 20 можно было открывать URL-адреса http, но не локальные файлы. Обновите здесь: https://github.com/cpbotha/xdg-open-wsl .

Попробуйте использовать wsl-open, Он открывает файлы со стандартным windows-приложением и может быть загружен здесь: https://github.com/4U6U57/wsl-open.

WSL начал совместную работу Windows-Linux в октябре, так что я думаю, что вы должны иметь возможность использовать Windows start прямо в Bash, так же, как в Powershell.
Просто позвони start.exe

Другие вопросы по тегам