为啥某些 Cygwin 文件不可执行?

Posted

技术标签:

【中文标题】为啥某些 Cygwin 文件不可执行?【英文标题】:Why are some Cygwin files not executable?为什么某些 Cygwin 文件不可执行? 【发布时间】:2019-02-24 22:51:57 【问题描述】:

我正在尝试从 Java 应用程序在 Windows 上执行 Cygwin 命令。在 cygwin 的 bin 中,我注意到有些文件是应用程序类型 (.exe),而其他文件(如 zcat 和 zless)没有扩展名,只是文件类型。

我已将 bin 添加到 Windows PATH 并且似乎只能从 cmd 执行 .exe 文件。下面的代码有效。

ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "ls");
Process p = pb.start();

我想使用 zcat 和 zless 之类的东西,但它们不可执行,并且 cmd 抱怨“zcat”未被识别为内部或外部命令, 可运行的程序或批处理文件。

如果我手动将文件更改为 .exe,我会收到一个弹出错误消息,指出由于与 64 位版本的 Windows 不兼容,zcat 无法启动或运行。我已经安装了 64 位版本的 cygwin (setup-x86_64)。为什么 cygwin 的 bin 不是所有可执行文件?

【问题讨论】:

添加“.”到PATHEXT 环境变量以允许CMD 执行没有文件扩展名的PE 映像。如果由于文件不是有效的 32 位或 64 位 PE 映像而导致内部 CreateProcessW 调用失败,这当然无济于事。它将退回到ShellExecuteExW,它会查找已注册的“。”文件关联。 zcat 可能是一个 sh 或 bash shell 脚本,因此它们必须使用 shbash 运行,而不是使用 cmd,这仅适用于 Windows 脚本。 添加“.”后到 PATHNEXT,cmd 可以找到该命令,但由于与 64 位 Windows 不兼容而无法执行。我安装了 64 位 cygwin,所以我想我无能为力了。 尝试type "path\to\zcat" 来检查它是否是一个 Unix shell 脚本,即一个包含 shebang 行和 Unix shell 命令的文本文件。如果是这样,您可以通过sh -c "path/to/zcat" 运行它。在 Windows 中,可以关联“.”。 (即没有扩展名的文件)使用像 "path\to\sh.exe" -c "%1" %* 这样的 progid 模板命令——但我不推荐它,而且它可能无论如何都不起作用,因为 Windows 将用 DOS 路径替换“%1”目标路径,这.exe 可能不支持。 这是我遇到的另一个问题。由于某种原因,我无法直接执行任何 cygwin 命令。我只能在它们位于 cmd 的 PATH 中时使用它们。 ***.com/questions/54818613/… 【参考方案1】:

大多数 cygwin 程序不是二进制程序,而是脚本之一。 命令file可以给你文件类型的描述:

$ file zcat
zcat: POSIX shell script, ASCII text executable

同时

$ file cat
cat: PE32+ executable (console) x86-64, for MS Windows

读取zcat的前5行

$ head -n 5 zcat
#!/bin/sh
# Uncompress files to standard output.

# Copyright (C) 2007, 2010-2016 Free Software Foundation, Inc.

我们在第一行看到#! 表示这是一个由 /bin/sh解释器。

在其他情况下我们可以有

$ head -n5 2to3
#!/usr/bin/python2.7.exe
import sys
from lib2to3.main import main

sys.exit(main("lib2to3.fixes"))

所以2to3 是一个python 2.7 脚本

【讨论】:

我明白了。所以我可以使用 cmd 来运行可执行文件,但必须为其他人调用 shell 解释器。我可以使用 cmd 调用 sh 还是必须直接调用 /bin/sh? /bin/sh 只能在 cygwin 中理解。使用path\to\sh.exe【参考方案2】:

没有其他人说过这个,所以对于正在寻找这个的其他人......如果您需要从cmd 窗口运行“z...”命令并且您的路径中有cygwin bin 目录,您可以使用 bash 运行它们(是的,这有点笨拙),如

bash zcat file.gz

等等

或者您可以直接从cygwin 终端运行它们。

FWIW 我必须找到“更多”实用程序并加载它们。由于某种原因,它们不在我下载的初始软件包中

【讨论】:

以上是关于为啥某些 Cygwin 文件不可执行?的主要内容,如果未能解决你的问题,请参考以下文章

C 编译器无法创建可执行文件 - Cygwin/MinGW

为啥 AssocQueryString 找不到与图像扩展关联的可执行文件?

为啥 cygwin 使用 Visual Studio BuildTools 而不是 gcc?

Windows下怎样编译出可在Linux上执行的程序

了解为啥执行某些位操作操作

为啥 esky 创建 2 个可执行文件?