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.