除了2016年夏季的Windows 10 Anniversary update之外,还有可能在新的Windows Subsystem for Linux (WSL)中运行ubuntu个二进制文件,这是一个"轻量级"虚拟化子系统.

不幸的是,启动C:\Windows\System32\bash.exe,另一个bash ELF二进制文件会在WSL内部启动一个进程,从那里你无法逃脱!您只能启动其他ELF二进制文件.

那么如何从Windows Bash执行*.exe个文件呢?[1]

[1] 问题也在Microsoft's "official" GH support repo年提出.

推荐答案

原生溶液

Windows 10 Insider Preview Update (14951)提供的官方解决方案基于几乎被遗忘的binfmt_msc Linux功能,用于启动二进制文件.binfmt_misc的注册命令如下(其中/init是win可执行文件的临时binfmt_misc"解释器"):

sudo echo ":WSLInterop:M::MZ::/init:" > /proc/sys/fs/binfmt_misc/register

然后win Executive将像常规程序一样启动:

$ export PATH=$PATH:/mnt/c/Windows/System32
$ notepad.exe
$ ipconfig.exe | grep IPv4 | cut -d: -f2
$ ls -la | findstr.exe foo.txt
$ cmd.exe /c dir

并不是说任何win可执行文件都必须驻留在windows(DrvFs)文件系统中,而不是Linux的文件系统(VolFs)中,才能继承正确的Windows工作目录.

The cbwin alternative

在获得最新版本之前,project cbwin提供了一个解决方案,在WSL中安装了3个新的linux命令:

  • wcmd:通过cmd.exe调用win可执行文件.
  • wrun:与CreateProcess同步调用win可执行文件,并等待死亡(不使用cmd.exe).
  • wstart:启动分离(异步)命令(使用cmd.exe).

要使用它们,您必须:

  1. 安装cbwin:
  2. 使用这个outbash.exe(无论安装在哪里)来启动WSL,而不是C:\Windows\System32\bash.exe
  3. 在任何win可执行文件前加上这些命令之一,例如wrun notepad.

Tip:如果用wcmdwrun启动的可执行文件产生了任何子文件,这些子文件只能在该可执行文件仍然存在的时间内存活.

换句话说,try 以wcmd开始notepad.exe是行不通的,因为notepad将在启动后立即被杀死——在本例中使用wrun(同步)或wstart(异步).

Linux相关问答推荐

使用sed替换字符,但如果它是在bash csv文件中的字符串中,则不使用

如何检测文件系统是否支持权限?

UTF-8输入和使用XGetICValues

为什么库中不调用全局变量的构造函数?

使用 ansible 验证 firewalld 配置

如何启用或切换现有的Flutter 项目(仅限移动设备)到 MacOS 或 WEB 或 Linux 或 Windows?

判断指定名称的画面是否存在

CHMOD 755 与 750 权限集之间的差异

增加 mysql docker 中的 max_allowed_pa​​cket 大小

在 64 位 Linux 操作系统上编译 32 位程序导致致命错误

如何在 UNIX 上的 $PATH 中转义冒号 (:)?

在 bash 中检测公共 IP 地址的方法

让 sudo 和 nohup 一起工作

to_string不是std的成员?

是否有一个 linux 命令来确定与给定进程 ID 关联的窗口 ID?

使用sudo apt-get install build-essentials

linux根据文件名模式搜索文件

Windows 开发环境值得付出代价吗?

如何将初始输入通过管道传输到随后将是交互式的进程中?

Ionic android 构建错误 - 找不到ANDROID_HOME环境变量