1

我在 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执行文件?

谢谢很多:-)

4

2 回答 2

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 位于 target/ 目录中,您现在可以像任何其他可执行文件一样按名称调用它:


$ cd target
$ mv foo-0.0.1-standalone.jar foo
$ ./foo crazy
Hello, crazy World!
$ ./foo
Hello, null World!

其他方法

Leiningen w/shebang

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

ClojureScript + V8 -> 带有 shebang 的 js

Clojure 并不是命令行脚本的最佳选择,因为 JVM 有预热时间。ClojureScript + V8 引擎被提出(在 Rich Hickey 的 ClojureScript 就职公告中)作为脚本编写的更好解决方案。这是带有详细示例的博客文章http://mmcgrana.github.com/2011/09/clojurescript-nodejs.html这是一个 StackOverflow 答案,展示了如何在 shebang 中使用节点:是否可以运行 Node.js不调用“节点”的脚本?

但是,由于您的目标似乎是没有编译步骤,因此您可能需要编写一个脚本,您将在 shebang 中使用该脚本,在运行之前从 cljs 构建 js。在这种情况下,您将再次遇到相同的 JVM 启动时间问题,因此使用上面链接的 Debasish 更简单的方法可能会更好。

于 2012-10-09T04:37:55.100 回答
0

这个聚会有点晚了:-)。

要回答有关 Windows 上的 hashbang 支持的直接问题:Widows 上的预构建 tcsh 有一个TCSHSUBSTHB可以设置的环境变量。在 README.NT 中,它被描述为:

指定 hashbang 仿真的映射。应该是 ';' - 分隔的空格分隔映射对。例如,

   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。

于 2016-10-06T14:34:40.027 回答