Windows上的tcsh:hashbang文件支持

时间:2012-10-08 17:31:54

标签: windows tcsh shebang

我在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

仍然相同:(

问题是:

  • Windows上预先构建的tcsh版本是否支持hashbang?
  • 如果是这样,如何使用hashbang执行文件?

很多: - )

2 个答案:

答案 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 w / shebang

使用leiningen shebang-style http://charsequence.blogspot.com/2012/04/scripting-clojure-with-leiningen-2.html

ClojureScript + V8 - > js w / shebang

由于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。