【问题标题】:Running Groovy script from the command line从命令行运行 Groovy 脚本
【发布时间】:2013-09-14 20:10:58
【问题描述】:

当我执行which groovy 时,我得到以下输出:

/usr/local/bin/groovy

所以我继续创建了一个helloworld.groovy,内容如下

#!/usr/local/bin/groovy
println "hello world"

之后我做了chmod +x helloworld.groovy 并尝试使用./hellworld.groovy 运行文件,遗憾的是,我收到了这个错误./helloworld.groovy: line 2: print: command not found

我可以通过更改为来摆脱错误

#!/usr/bin/env groovy
println "hello world"

为什么第一种方法会导致错误?

【问题讨论】:

标签: unix groovy


【解决方案1】:

你需要像这样运行脚本:

groovy helloworld.groovy

【讨论】:

  • 或只是groovy helloworld。 :)
  • 既然 groovy 也是一种脚本语言,我们应该可以像 perl 或 python 一样运行它吧?所以问题是为什么./helloworld.groovy 返回一个关于println 的错误。 #!/usr/local/bin/groovy#!/usr/bin/env groovy 有什么区别?
  • #!/usr/local/bin/groovy 是安装 groovy 的确切位置。这使得脚本不能移植到另一个安装了 groovy 的系统。但是,#!/usr/bin/env groovy 使用参数“groovy”调用程序“/usr/bin/env”,而 /usr/bin/env 正在搜索您的 PATH 变量以调用“groovy”。
    BTW:更好的shebang是#! /usr/bin/env。注意之间的空格!和 /。这样每个“脚本”的前 4 个字节都是相同的(老派把它作为文件的“幻数”)
  • @angel-osphere 为什么前 4 个字符相同更好?有什么真正的好处吗? (例如,它在不同的 shell/un*x 环境等下工作得更好吗?)
  • @DrUseful 如果你在 PDP-11 上运行,哈哈。否则,我认为这并不重要。 (无论如何,幻数都是 8 字节,而现代(至少过去 10 年)UNIX exec() 函数只查找 2 字节 #! 来确定它是否是脚本)
【解决方案2】:
#!groovy
println("hello world!")
$ chmod +x script.groovy
$ ./script.groovy

【讨论】:

  • 请描述您的代码以及它如何回答问题。
【解决方案3】:

它将适用于 Linux 内核 2.6.28(在 4.9.x 上确认)。它不适用于 FreeBSD 和其他 Unix 风格。

您的/usr/local/bin/groovy 是一个shell 脚本,它封装了运行Groovy 的Java 运行时。

请参阅 EXECVE(2)EXECVE(2)解释器脚本 部分。

【讨论】:

  • 4.9.x 版本是什么?
【解决方案4】:
#!/bin/sh
sed '1,2d' "$0"|$(which groovy) /dev/stdin; exit;

println("hello");

【讨论】:

    猜你喜欢
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-19
    • 2018-02-05
    • 1970-01-01
    • 2018-10-05
    • 2020-03-15
    相关资源
    最近更新 更多