기본 응용 프로그램을 사용하여 WSL에서 파일을 어떻게“열 수 있습니까?


12

대부분의 시스템은 제공 open명령 (교대로 알려진 start, cygstart, xdg-open즉 어떤 데스크톱 환경의 "기본"응용 프로그램에서 파일을 여는 등).

예를 들어, 입력 할 때 Powershell에서 :

PS> start form.pdf

문서가 Edge에서 열립니다.

Bash-on-Ubuntu-on-Windows가 이것을 할 수 있습니까?

답변:


29

Windows Linux interop이 작동하기 시작한 후 다음을 호출 할 수 있습니다.

cmd.exe /C start <file>

상대 경로, 절대 경로에 대해 저에게 ... | sed 's/\/mnt\/\(.\)/\1:/1' | xargs cmd.exe /C start
Michael

1
좋은 해결책. superuser.com/q/1110974/66714의 정보를 사용하여 Linux 파일 시스템의 파일에 액세스 할 수도 있습니다 . 같은 뭔가 cmd.exe /c start "%localappdata%/lxss/$(readlink -f $some_relative_path)"이제 우리는 화재 요리있어!
Cheezmeister

2

이것은 A) WSL 내에서 리눅스 프로그램을 시작할 것인지 또는 B) bash 쉘 프롬프트에서 Windows 프로그램을 시작할 것인지에 달려 있습니다.

B) 인 경우 cygwin / bash를 설치하면 예입니다. 예를 들어 Windows 용 git을 설치 하면 bash가있는 Windows에서 시스템이 실행됩니다. 그런 다음 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)의 경우, GUI 창에 .pdf를 표시하기 위해 Linux 프로그램을 시작하려는 경우 특히 훨씬 어려워집니다. Windows는 기본 응용 프로그램을 연결하여 pdf 파일을 여는 것을 알고 있지만 WSL에는 정보가 없습니다. 따라서 WSL 에서 데스크톱을 실행 하더라도 pdf를 열려면 Linux GUI 앱을 연결해야합니다.

명확히하기 위해 WSL 내에서 Windows 실행 파일이 아닌 Linux 실행 파일을 실행하십시오.

(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

Martijn이 언급했듯이 이것은 Windows 응용 프로그램 / 파일을 실행 / 열 수있는 올바른 방법입니다.

cmd.exe /C start <file>

내 시스템 경로에있는 폴더에 보관하는 bash 스크립트 로이 작업을 수행하는 것이 매우 유용하다는 것을 알았습니다. 나는 그것을 이름 start과 어떻게 chmod 0744그것을 실행하기 위해 파일에. $*수단은 당신이 스크립트로 제공되는 명령 줄 인수를 모두 전달합니다 cmd.exe.

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

내 시스템 경로 에이 명령을 사용하면 Windows에서 열리는 Linux에서 다음과 같은 명령을 수행 할 수 있습니다.

  1. start FileXYZ.pdf // Windows의 기본 할당 된 PDF 뷰어에서 PDF를 엽니 다.
  2. start explorer . // Windows 탐색기에서 현재 WSL 폴더를 엽니 다
  3. start MyApp.exe // Windows 응용 프로그램을 시작합니다

1
유일한 문제는이 솔루션이 이름에 공백이있는 파일에서는 작동하지 않는다는 것입니다.
0x7d7b

@ h3nrik 좋은 지적입니다. Linux에서 공백이있는 많은 파일을 열지 않는 것 같습니다. 처리하기 위해 스크립트를 업데이트했습니다.
pseudosavant

Linux에서 공백이있는 파일 이름은 일반적으로와 같은 백 슬래시로 처리됩니다 a\ whitespace.pdf. 스크립트를 시작 start.sh a\ a.pdf b\ b.pdf하면 작동하지 않습니다.
0x7d7b

explorer.exe .Windows 탐색기에서 현재 경로를 엽니 다
johnny

1

eopen WSL 내에서 다양한 파일 (디렉토리 및 URI)을 열 수 있습니다.

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

1

이것은 나를 위해 훨씬 잘 작동했습니다.

explorer.exe `wslpath -aw <path>`

1

Start-ProcessWSL 내에서 powershell의 명령을 호출 할 수 있습니다 .

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.


1

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

업데이트 : Ngo는 wslpath경로 변환을 수행하는 다른 스크립트를 지적 했으므로 경로에서 직접 explorer.exe를 호출 할 수 있습니다 (변환 후). 그런 다음 위의 기능이 사소 해져 쉽게 별칭을 만들 수 있습니다.


훌륭한 솔루션!
Stabledog


0

Martijn의 답변을 확장하려면

alias start='cmd.exe /C start'

.bashrc에서 예상되는 Windows 동작을 얻으려면 예를 들어 start .현재 디렉토리에서 탐색기를 엽니 다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.