Como posso "abrir" um arquivo da WSL com o aplicativo padrão?


12

A maioria dos sistemas proporcionam um opencomando (alternadamente conhecido como start, cygstart, xdg-openetc.) que abre um arquivo no aplicativo do ambiente de trabalho "default", o que quer que seja.

Por exemplo, no Powershell quando eu digito:

PS> start form.pdf

O documento é aberto no Edge.

O Bash-on-Ubuntu-on-Windows pode fazer isso?

Respostas:


29

Desde que a interoperabilidade do Windows Linux começou a funcionar, você pode ligar para:

cmd.exe /C start <file>

Obras para me para caminhos relativos, para caminhos absolutos eu escrevi um script para substituto / mnt / c por c: ... | sed 's/\/mnt\/\(.\)/\1:/1' | xargs cmd.exe /C start
— Michael

1
Ótima solução. Também podemos acessar arquivos no sistema de arquivos Linux usando as informações de superuser.com/q/1110974/66714 . Algo como cmd.exe /c start "%localappdata%/lxss/$(readlink -f $some_relative_path)"Agora estamos cozinhando com fogo!
— Cheezmeister

2

Isso depende se você deseja A) iniciar um programa Linux dentro da WSL ou B) se deseja iniciar um programa Windows a partir de um prompt do shell bash.

Se B) então sim se você instalar o cygwin / bash. Por exemplo, instale o git para windows e você tem um sistema em execução no windows com bash. Então você pode simplesmente executar o start, na verdade ele está incluído como um script:

$ 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 "${@//&/^&}"

Se A), fica muito mais difícil, especialmente se você deseja iniciar um programa Linux para exibir um arquivo .pdf em uma janela da GUI. Observe que o Windows sabe associar um aplicativo padrão para abrir um arquivo pdf, mas o WSL não possui as informações. Portanto, mesmo que você tenha um Desktop em execução no WSL , precisará associar um aplicativo GUI do Linux para abrir o pdf.

Nota para esclarecer, no WSL você executa executáveis ​​linux, não executáveis ​​do 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

2

Como Martijn observou, esta é a maneira correta de executar / abrir um aplicativo / arquivo do Windows.

cmd.exe /C start <file>

Achei muito útil trabalhar isso em um script bash que eu mantenho em uma pasta que está no caminho do sistema. Eu o nomeio starte faço chmod 0744no arquivo para torná-lo executável. O $*meio para transmitir todos os argumentos da linha de comando que você forneceu ao script cmd.exe.

#!/bin/bash
cmd.exe /c start "Launching from BASH" "$*"

Com esse comando no caminho do sistema, posso comandos como este no Linux que abrem no Windows:

  1. start FileXYZ.pdf // Abre o PDF no visualizador de PDF atribuído padrão no Windows
  2. start explorer . // Abre a pasta WSL atual no Windows Explorer
  3. start MyApp.exe // Inicia o aplicativo Windows

1
O único problema é que esta solução não funciona com arquivos com espaços em branco em seus nomes.
— 0x7d7b 05/11/19

@ h3nrik Ótimo ponto. Acho que não abro muitos arquivos com espaços no Linux. Eu atualizei o script para lidar com isso.
— Pseudosavant

No Linux, os nomes de arquivos com espaços em branco geralmente são tratados com barras invertidas como a\ whitespace.pdf. Iniciar seu script start.sh a\ a.pdf b\ b.pdfnão funcionaria.
— 0x7d7b 06/11/19

explorer.exe .abre o caminho atual no Windows Explorer
— johnny

1

eopen pode abrir vários arquivos (, diretórios e URI) no WSL.

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

Exemplos

# 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

1

Isso funcionou muito melhor para mim:

explorer.exe `wslpath -aw <path>`

1

Você pode chamar o Start-Processcomando do powershell de dentro da WSL:

powershell.exe -Command Start-Process file

Para que isso funcione também com caminhos absolutos, você pode usar o wslpath -wacomando para converter o caminho em um caminho do Windows.

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

Isso tem uma vantagem sobre a cmd.exesolução: para compartilhamentos de rede montados, wslpathproduz um caminho UNC \\server\share\. Esses caminhos UNC não podem ser manipulados cmd.exe.


1

Descobri que o explorer.exe funciona muito bem para encontrar o caminho resolvido correto (mesmo nos diretórios de rede montados) e iniciar a ferramenta padrão. O problema é que você não pode ter caminhos no nome do arquivo; portanto, é necessário criar uma pequena função / script auxiliar para iniciar o explorer corretamente, por exemplo:

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")
}

Atualização: o Ngo apontou outro script, wslpathque faz a conversão do caminho, para que você possa chamar o explorer.exe diretamente no caminho (após a conversão). Então a função acima se torna trivial e pode ser facilmente transformada em um alias.


Excelente solução!
— Stabledog 12/03

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.