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

How to convert a msys shell script into a windows exe file

是否有通用的方法将 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 工具链的最佳解决方案。

您最初是在 "How [can I] convert an MSYS shell script to a Windows .exe?" 标题下提出这个问题的,在我看来,这个问题通常比您现在提出的问题更有用(也非常具体)。在此基础上,我将提供对原问题的回答。

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

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

因此,如果您可以配置您的 emacs clojure 进程以这种方式调用命令,您可以实现您的objective。

但是,

请注意:MSYS 命令旨在 运行 来自已经 运行 且正确初始化的 MSYS parent shell。如果 emacs 运行ning 作为 shell 的 child,那么这应该没问题。但是,如果 emacs 运行宁作为一个纯粹的本地 Windows 进程,在 MSYS 环境之外,那么 you 必须负责初始化[*],当您调用 child shell 时。如果您看到 "resource unavailable""resource temporarily unavailable""cannot reserve space for cygwin's heap" 等错误消息,(是的,MSYS 源自早期的 cygwin 版本,并且此消息的文本从未更改过),这是一个相当确定的指标,表明 shell 环境未正确初始化。

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