如何将 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 安装。
是否有通用的方法将 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 安装。