如何在OSX上从shell脚本运行Clozure CL(Lisp)?

如何在OSX上从shell脚本运行Clozure CL(Lisp)?,lisp,common-lisp,Lisp,Common Lisp,我尝试了以下方法: $ cat args.sh \#! /Applications/ccl/dx86cl64 (format t "~&~S~&" *args*) $ ./args.sh #! /bin/bash exec /Applications/ccl/dx86cl64 -b -e '(progn (load "'$1'") (ccl::quit))' 无法从/args.sh 我可以直接运行lisp fine: $ /Applications/ccl/dx86cl6

我尝试了以下方法:

$ cat args.sh
\#! /Applications/ccl/dx86cl64
(format t "~&~S~&" *args*)

$ ./args.sh 
#! /bin/bash
exec /Applications/ccl/dx86cl64 -b -e '(progn (load "'$1'") (ccl::quit))'
无法从
/args.sh

我可以直接运行lisp fine:

$ /Applications/ccl/dx86cl64
Welcome to Clozure Common Lisp Version 1.5-r13651  (DarwinX8664)!

? 
是否可以编写一个shell脚本来使用Clozure CL运行lisp代码?我肯定我在做傻事


我是从以下位置安装的:

您必须确保内核可以加载Lisp内存映像。默认行为是内核查找一个文件,该文件的名称类似于附加了“.image”的内核二进制文件,即,如果使用
dx86cl64
启动CCL,则加载的图像是来自同一目录的
dx86cl64.image
。您可以通过使用
--image
选项明确地提供图像来修改此行为。请尝试
dx86cl64--help
了解更多信息。

问题在您的shebang行中:

\#! /Applications/ccl/dx86cl64
在UNIX文件中,前16位称为“幻数”。可执行脚本的幻数恰好与字符“#!”的位配置相同。文件的前16位的配置与“\\#”相同,UNIX不会买它

可以添加幻数,但这并不容易或可移植,因此您需要的是一种调用脚本的方法。我建议

#! /bin/bash
exec /Applications/ccl/dx86cl64 
为脚本提供适当的参数等。(内置的
exec
会使当前进程加载指定的可执行文件,而不进行分叉,因此您没有备用进程。)

更新

在你的特殊情况下,你会想要

@! /bin/bash
exec /Applications/ccl/dx86cl64 --eval '(format t "~&~S~&" *args*)'

请参阅了解原因。

请参阅ccl目录的scripts子目录。它应该有一些脚本可以修改和使用。

不能从命令行这样调用脚本:

/Applications/ccl/dx86cl64 myscript
你能吗

我认为你需要这样称呼它(我这里没有Clozure CL,所以我无法测试):

因此,您的脚本应该这样开始:

#!/Applications/ccl/dx86cl64 -b -l
...

只是跟进Charlie Martin的回答和随后的问题。
dx86cl64--eval
将启动一个REPL,因此如果您想启动一个给定的脚本,然后退出,只需将它添加到脚本的末尾:
(ccl::quit)
。在您提供的示例中,这将实现以下目的:

#! /bin/bash 
exec /Applications/ccl/dx86cl64 --eval '(progn (format t "hello script") (ccl::quit))'
更好的脚本如下所示:

$ cat args.sh
\#! /Applications/ccl/dx86cl64
(format t "~&~S~&" *args*)

$ ./args.sh 
#! /bin/bash
exec /Applications/ccl/dx86cl64 -b -e '(progn (load "'$1'") (ccl::quit))'
将其放入一个文件,
load ccl script.sh
(或您选择的其他名称)。然后,以下交互工作:

$ echo '(format t "weeee!")' > a.lisp
$ sh load-ccl-script.sh a.lisp
weeee!
$ _

谢谢你的建议。我试过这个:#/bin/bash exec/Applications/ccl/dx86cl64--eval'(格式为t“hello script”)’,除了在方法执行后得到lisp提示外,其他都可以。如何退出循环?$/args.sh hello脚本欢迎使用Clozure Common Lisp版本1.5-r13651(达尔文x8664)?至少在Clozure 1.4
(再见)
不可用之前
(ccl::quit)
(因此,如果您使用的是
ccl
软件包,那么
(quit)
也会起作用)。我使用了大约6种lisp变体,这类事情很难保持正确。谢谢,是的。不幸的是,它们不是lisp代码脚本,而是shell实用程序。谢谢!(我猜'sh load-ccl-script.sh a.lisp'中的'sh'是多余的…)是真的,但如果没有它,我不得不包含
chmod+x load ccl script.sh
行-这3个字符更简洁,因为这不是代码段的目的,所以我采取了懒惰的方式:)