有没有一种通用方法可以将 msys/MinGW 下的 shell 脚本转换为 windows .exe
文件(在幕后调用 shell 脚本)?
面临的具体问题是我有一个来自Leiningen(clojure工具链)的shell脚本lein
。我将其安装到/usr/local/bin
的默认路径(注意:我使用了 MSYS 的 shell 脚本版本,并且不想在 MinGW/MSys 树之外安装lein
命令)。
现在 emacs 苹果酒无法获取lein
脚本,尽管lein
在窗口路径上并exec-path
。如果我lein
复制到假lein.exe
cd /usr/local/bin && cp lein lein.exe
然后,cider
认出了lein.exe
.但是,当然,cider
无法加载它,因为它不是有效的exe
。
因此,我的问题。有没有一种通用的方法可以将像 lein
这样的 shell 脚本转换为 Windows 可执行文件,例如通过编写代理 c++ 程序?
谢谢。
--编辑---
(看到反对票后的想法)。
我知道这是一个极端情况,可能不是你每天都要做的事情,但这是我迄今为止能确定的在 MinGW/MSY 中制作可行的 clojure 工具链的最佳解决方案。
您最初在"如何[我可以]将MSYS shell脚本转换为Windows .exe"标题下问过这个问题。 在我看来,这是一个通常比你现在问的问题更有用(而且非常具体)的问题。在此基础上,我将对原始问题给出答案。
我知道没有办法简单地将MSYS shell脚本(或任何Bourne shell脚本)编译成Windows可执行文件,以便它可以作为另一个可执行文件的子级调用。但是,您可以做的是调用 MSYS 外壳本身作为子进程来解释脚本;您需要的语法是:
sh.exe -c 'script [argument ...]'
因此,如果你能配置你的Emacs Clojure进程以这种方式调用命令,你就可以实现你的目标。
但是,需要注意的是:MSYS 命令旨在从已经运行且正确初始化的 MSYS 父 shell 中运行。如果 emacs 作为这样一个 shell 的子级运行,那么这应该可以正常工作。但是,如果 emacs 在 MSYS 环境之外作为纯原生 Windows 进程运行,那么在调用子 shell 时,您必须注意初始化[*]。如果您看到诸如"资源不可用"、"资源暂时不可用"或"无法为 cygwin 的堆保留空间"之类的错误消息(是的,MSYS 源自早期的 cygwin 版本,并且此消息的文本从未更改),这是一个相当确定的指标,表明 shell 环境未正确初始化。
[*] 实际上,您需要重现由 msys.bat 命令脚本执行的初始化步骤,该脚本随任何 MSYS 安装一起执行。