我在Windows上使用tcsh的预构建二进制exe。
我正在尝试编写一些clojure脚本。像这样:
#!/usr/bin/env java clojure.main
(prn "Hello World!\n")
首先我尝试在tcsh中直接运行它:
# cat test
#!/usr/bin/env java clojure.main
(prn "Hello World\n")
# ./test
#
没有幸运:“选择正确的程序来打开此文件”窗口出现,但不执行它。
我正在尝试添加+ x mod:
# chmod +x test
# ls-F -l test
-rwxr-xr-x 1 SW Administ 59 Oct 9 01:25 test*
# ./test
仍然相同:(
问题是:
很多: - )
答案 0 :(得分:0)
我建议您将程序编译为uberjar吗? jar可以像你的包装器脚本一样按名称执行,但这样你就不需要额外的包装器了。
下载最新版本的leiningen并创建一个项目$ lein new foo
,然后进入该目录。当您正在开发代码时,您可能希望使用repl($ lein repl
),或者调用$ lein run
从命令行运行它。
编辑src / foo / core.clj:为AOT编译添加一个gen-class,以及一个main函数。
(ns foo.core
(:gen-class))
(defn -main [& [a]]
(println (format "Hello, %s World!" a)))
编辑project.clj并将其作为主要类:
(defproject foo "0.0.1"
:description "FIXME: write description"
:dependencies [[org.clojure/clojure "1.4.0"]]
:main foo.core)
现在编译uberjar并使其可执行:
$ lein do clean, compile, uberjar ; chmod +x ./target/foo-0.0.1-standalone.jar
可执行jar位于目标/目录中,您现在可以像任何其他可执行文件一样通过名称调用:
$ cd target
$ mv foo-0.0.1-standalone.jar foo
$ ./foo crazy
Hello, crazy World!
$ ./foo
Hello, null World!
使用leiningen shebang-style http://charsequence.blogspot.com/2012/04/scripting-clojure-with-leiningen-2.html
由于JVM预热时间,Clojure并不是命令行脚本的最佳选择。 ClojureScript + V8引擎被提出(在Rich Hickey首次发布的ClojureScript中)作为脚本编写的更好解决方案。这是博客文章,其中包含详细示例http://mmcgrana.github.com/2011/09/clojurescript-nodejs.html这里是一个StackOverflow答案,展示如何在shebang中使用节点:Is it possible to run Node.js scripts without invoking `node`?
但是,由于你的目标似乎是没有编译步骤,你可能想编写一个脚本,你将在你运行它之前从cljs构建js的shebang中使用它。在这种情况下,您将再次拥有相同的JVM启动时间问题,因此您可能最好使用上面链接的Debasish更简单的方法。
答案 1 :(得分:0)
这个派对有点晚了: - )。
回答有关Windows上hashbang支持的直接问题:Widows上的预构建tcsh有一个可以设置的TCSHSUBSTHB
环境变量。从README.NT开始,它被描述为:
指定hashbang仿真的映射。应该是&#39 ;;' -separated 成对的空白分隔映射。 例如,
setenv TCSHSUBSTHB "/usr/local/bin/perl c:/bin/perl.exe;"
会将
#!c:/bin/perl.exe
替换为顶部有#!/usr/local/bin/perl
的脚本。决赛';'必须包括在内。
例如在我的.tcshc中我有
setenv TCSHSUBSTHB "/usr/bin/tclsh j:/Tcl/bin/tclsh84.exe;"
如果您可以将#!/usr/bin/java
放在此脚本的顶部,则可以使用TCSHSUBSTHB
映射到您的Windows java.exe
。
解决这个问题的另一种方法是使用Cygwin的tcsh,它更像Unix,支持hashbang。