大多数系统提供了一个open
命令(也就是通常所说start
,cygstart
,xdg-open
这将打开在桌面环境中的“默认”的应用程序,不管它是什么文件等)。
例如,从Powershell输入以下内容时:
PS> start form.pdf
该文档在Edge中弹出。
Windows上的Ubuntu上的Bash可以做到吗?
大多数系统提供了一个open
命令(也就是通常所说start
,cygstart
,xdg-open
这将打开在桌面环境中的“默认”的应用程序,不管它是什么文件等)。
例如,从Powershell输入以下内容时:
PS> start form.pdf
该文档在Edge中弹出。
Windows上的Ubuntu上的Bash可以做到吗?
Answers:
自Windows Linux互操作程序开始工作以来,您现在可以致电:
cmd.exe /C start <file>
cmd.exe /c start "%localappdata%/lxss/$(readlink -f $some_relative_path)"
现在我们正在用火做饭!
这取决于您是否要A)在WSL中启动linux程序,还是B)您要从bash shell提示符启动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),则要困难得多,尤其是当您要启动Linux程序以在GUI窗口中显示.pdf时。请注意,Windows知道可以关联默认应用程序以打开pdf文件,但WSL没有该信息。因此,即使您确实在WSL下运行了Desktop,也需要关联linux GUI应用程序以打开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
正如Martijn所指出的,这是执行/打开Windows应用程序/文件的正确方法。
cmd.exe /C start <file>
我发现将其处理为bash脚本非常有用,该脚本保存在系统路径中的文件夹中。我将其命名start
并chmod 0744
对该文件执行以使其可执行。这$*
意味着它将把您提供给脚本的所有命令行参数传递给cmd.exe
。
#!/bin/bash
cmd.exe /c start "Launching from BASH" "$*"
在系统路径中使用此命令,我可以在Windows中打开如下命令:
start FileXYZ.pdf
//在Windows中默认分配的PDF查看器中打开PDFstart explorer .
//在Windows资源管理器中打开当前的WSL文件夹start MyApp.exe
//启动Windows应用程序a\ whitespace.pdf
。像start.sh a\ a.pdf b\ b.pdf
这样启动脚本将不起作用。
explorer.exe .
在Windows资源管理器中打开当前路径
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
您可以Start-Process
从WSL中调用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
。
我发现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。这样,上面的函数就变得微不足道了,可以轻松地用作别名。
尝试使用wsl-open
。它使用其标准Windows应用程序打开文件,可以在这里下载:https : //github.com/4U6U57/wsl-open。
... | sed 's/\/mnt\/\(.\)/\1:/1' | xargs cmd.exe /C start