¿Cómo puedo "abrir" un archivo de WSL con la aplicación predeterminada?


12

La mayoría de los sistemas proporcionan un opencomando (alternativamente conocido como start, cygstart, xdg-openetc.) que se abre un archivo en la solicitud del entorno de escritorio "por defecto", sea lo que sea.

Por ejemplo, de Powershell cuando entro:

PS> start form.pdf

El documento se abre en Edge.

¿Puede Bash-on-Ubuntu-on-Windows hacer esto?

Respuestas:


29

Desde que la interoperabilidad de Windows Linux comenzó a funcionar, ahora puede llamar:

cmd.exe /C start <file>

Funciona para mí para rutas relativas, para rutas absolutas, escribí un script para sustituir / mnt / c por c: ... | sed 's/\/mnt\/\(.\)/\1:/1' | xargs cmd.exe /C start
Michael

1
Buena solución También podemos acceder a archivos en el sistema de archivos de Linux utilizando la información de superuser.com/q/1110974/66714 . Algo así como ¡ cmd.exe /c start "%localappdata%/lxss/$(readlink -f $some_relative_path)"Ahora estamos cocinando con fuego!
Cheezmeister

2

Esto depende de si desea A) iniciar un programa de Linux dentro de WSL o B) desea iniciar un programa de Windows desde un indicador de shell bash.

Si B) entonces sí si instala cygwin / bash. Por ejemplo, instale git para Windows y tiene un sistema que se ejecuta en Windows con bash. Luego puede ejecutar start, en realidad se incluye como un 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 "${@//&/^&}"

Si A), se vuelve mucho más difícil, especialmente si desea iniciar un programa de Linux para mostrar un .pdf en una ventana GUI. Tenga en cuenta que Windows sabe asociar una aplicación predeterminada para abrir un archivo pdf, pero WSL no tiene la información. Por lo tanto, incluso si obtuviera un Escritorio ejecutándose bajo WSL , necesitaría asociar una aplicación GUI de Linux para abrir el pdf.

Nota para aclarar, dentro de WSL ejecutas ejecutables de Linux, no ejecutables de 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 señaló, esta es la forma correcta de ejecutar / abrir una aplicación / archivo de Windows.

cmd.exe /C start <file>

Me pareció muy útil trabajar esto en un script bash que guardo en una carpeta que está en la ruta de mi sistema. Lo nombro starty hago chmod 0744al archivo para hacerlo ejecutable. Esto $*significa que pasará todos los argumentos de la línea de comandos que proporcionó al script cmd.exe.

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

Con este comando en la ruta de mi sistema, puedo comandos como este en Linux que se abren en Windows:

  1. start FileXYZ.pdf // Abre el PDF en el visor de PDF asignado por defecto en Windows
  2. start explorer . // Abre la carpeta WSL actual en el Explorador de Windows
  3. start MyApp.exe // Inicia la aplicación de Windows

1
El único problema es que esta solución no funciona con archivos que tienen espacios en blanco en su nombre.
0x7d7b

@ h3nrik Gran punto. Supongo que no abro muchos archivos con espacios en Linux. Actualicé el script para manejar eso.
pseudosavant

En Linux, los nombres de archivo con espacios en blanco generalmente se manejan con barras invertidas como a\ whitespace.pdf. Iniciar su script como start.sh a\ a.pdf b\ b.pdfno funcionaría.
0x7d7b

explorer.exe .abre la ruta actual en el Explorador de Windows
Johnny

1

eopen puede abrir varios archivos (, directorios y URI) dentro de WSL.

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

Ejemplos

# 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

Esto funcionó mucho mejor para mí:

explorer.exe `wslpath -aw <path>`

1

Puede llamar al Start-Processcomando de powershell desde WSL:

powershell.exe -Command Start-Process file

Para que esto también funcione con rutas absolutas, puede usar el wslpath -wacomando para traducir la ruta a una ruta de Windows.

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

Esto tiene una ventaja sobre la cmd.exesolución: para recursos compartidos de red montados, wslpathproduce una ruta UNC como \\server\share\. Estas rutas UNC no pueden ser manejadas por cmd.exe.


1

Descubrí que explorer.exe funciona bastante bien para encontrar la ruta resuelta correcta (incluso de los directorios de red montados) y ejecutar la herramienta predeterminada. El único problema es que no puede tener rutas en el nombre del archivo, por lo que debe crear una pequeña función auxiliar / script para iniciar el explorador correctamente, por ejemplo:

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

Actualización: Ngo señaló otro script, wslpathque realiza la conversión de ruta, por lo que puede llamar a explorer.exe directamente en la ruta (después de la conversión). Entonces la función anterior se vuelve trivial y puede convertirse fácilmente en un alias.


Excelente solucion!
Stabledog

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.