如何将 msys shell 脚本转换为 windows exe 文件

Posted

技术标签:

【中文标题】如何将 msys shell 脚本转换为 windows exe 文件【英文标题】:How to convert a msys shell script into a windows exe file 【发布时间】:2015-06-10 22:52:09 【问题描述】:

有没有通用的方法将 MSYS/MinGW 下的 shell 脚本转换成 windows .exe 文件(在后台调用 shell 脚本)?

我面临的具体问题是我有一个来自 Leiningen(clojure 工具链)的 shell 脚本lein。我将它安装到默认路径 /usr/local/bin(注意:我使用了 MSYS 的 shell 脚本版本,并且不想在 MinGW/MSys 树之外安装 lein 命令)。

现在emacs cider 无法获取lein 脚​​本,尽管lein 在Windows 路径上并且exec-path。如果我将lein 复制成假的lein.exe

cd /usr/local/bin && cp lein lein.exe

然后,cider 识别 lein.exe。但当然,cider 无法加载它,因为它不是有效的 exe

因此,我的问题。有没有一种通用的方法可以将lein 之类的 shell 脚本转换为 Windows 可执行文件,例如通过编写代理 c++ 程序?

谢谢。

-- 编辑 ---

(看到反对票后的想法)。

我知道这是一个极端情况,也许不是你每天都做的事情,但这是迄今为止我能确定的在 MinGW/MSYS 中制作一个可行的 clojure 工具链的最佳解决方案。

【问题讨论】:

像其他问“有没有办法做 X”的问题一样,这个问题太宽泛了。 正如您最初提出的那样,我认为这个问题一点也不宽泛;事实上,恰恰相反,我可能已经为这个问题提供了答案。现在你已经完全改变了它的范围,我根本没有兴趣解决。 @KeithMarshall,如果您可以发布或概述一个潜在的答案,我会回滚这个问题。我真的不认为我的问题很宽泛,也不在乎其他人认为它太宽泛了。我缩小范围只是因为我有兴趣寻求解决方案。在我的书中,更通用的 MinGW/MSYS 解决方案当然更好。 @KeithMarshall 你能帮我把我的问题编辑成你看到的原始表格吗?我找不到回滚自己的编辑的方法。 除了suggest 编辑之外,我没有足够的权限做任何事情,所以不,我真的不能帮你。如果您单击问题下方的edited x hours ago 链接,您应该会看到完整的编辑历史;你原来的问题是here 【参考方案1】:

您最初在“我如何将 MSYS shell 脚本转换为 Windows .exe?”标题下提出了这个问题。在我看来,这通常比您现在要问的问题更有用(而且非常具体)。在此基础上,我将对原问题进行解答。

我不知道有什么方法可以简单地将 MSYS shell 脚本(或者实际上是 any Bourne shell 脚本)编译到 Windows 可执行文件中,这样它可以作为另一个可执行文件的子项调用。但是,您可以做的是调用 MSYS shell 本身作为子进程来解释脚本;您需要的语法是:

sh.exe -c 'script [argument ...]'

所以,如果您可以将您的 emacs clojure 进程配置为以这种方式调用命令,您可能实现您的目标。

但请注意:MSYS 命令旨在从已运行且已正确初始化的 MSYS 父 shell 中运行。如果 emacs 作为这样一个 shell 的子进程运行,那么这应该可以正常工作。但是,如果 emacs 在 MSYS 环境之外作为纯本机 Windows 进程运行,那么当您调用子 shell 时,必须注意初始化[*]。如果您看到 “资源不可用”“资源暂时不可用”“无法为 cygwin 的堆预留空间” 等错误消息,(是的,MSYS 源自早期的 cygwin 版本,并且此消息的文本从未更改过),这是一个相当确定的指示,表明 shell 环境未正确初始化。

[*] 实际上,您需要重现由 msys.bat 命令脚本执行的初始化步骤,该脚本伴随任何 MSYS 安装。

【讨论】:

以上是关于如何将 msys shell 脚本转换为 windows exe 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 shell 脚本将 xlsx 文件转换为 csv 文件?

在 MSYS 下使用 Command 在 Windows 上调用 shell 脚本

如何使用 unix shell 脚本将 impala 查询输出日志转换为变量?

从命令提示符或 PowerShell 调用 MSYS2 Shell

MSYS2:如何禁用路径名到驱动器号的自动转换?

在 MSYS2/MinGW 中执行脚本