Sil*_*olo 5 bash common-lisp detection
我正在编写一个 Common Lisp 应用程序。我想要一个 Bash 脚本作为应用程序的入口点。目前,我已经编写了脚本,因此用户必须输入他们的 Common Lisp 实现的名称才能运行它,所以我会./script.sh clisp为 GNU CLISP编写代码,但使用 SBCL 的人必须编写./script.sh sbcl. 这是必要的,因为与 Python 和 Ruby 等语言不同,Common Lisp 实现没有任何标准名称或调用它们的标准化方法。
有什么技巧可以检测安装了哪个 Common Lisp 实现,也许是环境变量或其他什么?基本上,我正在寻找比强迫用户传递实现名称更好的方法。
TL;DR:我认为没有什么技巧,但您不需要在每次调用时都需要 clisp 解释器。
这是一种相对常见的模式:您有一个 bash 脚本,它依赖于某个可用的可执行文件,并且它很可能可用,但位于不同的位置,可能用户有自己的编译版本和/或系统有多个替代方案。
我见过的方法可以归结为这个算法:
前三个很容易使用 bash 测试函数来实现,我猜,如果您到目前为止,您就知道如何做到这一点。(如果没有,请询问,我将发布示例。)
第四点变得有趣。有两个变量需要处理。首先,确定安装环境中的包管理器。这些方法并不缺乏,我已经看到了表方法(将操作系统映射到包管理器)和查询方法(寻找与预期名称匹配的可执行文件,如rpm、yum、emerge等)。其次,确定适合您的包管理器的包名称。这也可能很棘手。一方面,您可能可以安全地迭代已知可执行文件的列表并 grep 列表。另一方面,您的包管理器可能会提供通常提供服务的“虚拟”或“替代”包,而不管具体的实现如何。例如,您可以 grep portage 树dev-lisp并相当肯定地找到一个已安装的软件包。
最简单的情况是当您的脚本要在少数众所周知的环境中运行时:实现前三点中的一个或多个,让用户覆盖脚本的自动选择,然后您的脚本的自动选择只是迭代已知环境中的已知替代方案,直到找到它喜欢的替代方案。
困难的情况是当您必须支持多种环境时。您最终会编写一个抽象层,该抽象层了解不同的可能的包管理器以及如何在通用级别或针对特定包询问这些包系统以获取各种包。在为部署在 AIX、HP-UX、Solaris、几个 Linux 发行版和 cygwin Windows 上的脚本集完成此操作后,我可以说:不好玩。
当我阅读您的问题时,您有一个脚本将分发到您无法控制其环境的不同用户的计算机。这些目标机器的唯一要求是它们bash至少安装了一个 Common LISP 解释器。由此,我推断您无法安装任何加载程序。但是,如果您可以安装、要求或检测其他答案中提到的任何启动器的存在,那肯定会节省大量工作。