为啥某些 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 脚本,因此它们必须使用 sh
或 bash
运行,而不是使用 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 文件不可执行?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 AssocQueryString 找不到与图像扩展关联的可执行文件?