2011-03-29 28 views
15

是否可以在文件開頭聲明它應該作爲Groovy腳本執行?對於其他腳本語言Shebang和Groovy

例子:

#!/bin/sh 
#!/usr/bin/python 
#!/usr/bin/perl 
+7

當你知道#!被稱爲「shebang」,正如你可以從我不知道的評論中看到的那樣。 – Nulldevice 2011-03-30 13:32:38

+0

請注意,shebang行上的第一個單詞必須是二進制可執行文件。如果碰巧你的「groovy」程序是一個shell腳本,你必須使用'#!/ usr/bin/env groovy'表單。 – 2011-03-30 17:21:53

+1

有趣的是,它使用谷歌搜索它返回到這個頁面。堆棧溢出實際上是最好的資源,即使是像這樣的簡單問題。其他人會直接來到這裏,得到一個權威的答案,而不是瀏覽不同的博客文章。 – 2014-03-14 18:35:39

回答

39

這一個#!/usr/bin/env groovy
會搜索自己的路徑尋找常規執行腳本

+3

一個限制是你不能在linux上使用shebang時給groovy任何參數(如類路徑)。看[這個答案](http://stackoverflow.com/a/8945888/54396)。 – Patrick 2012-01-20 18:40:19

5

根據this你可以使用#!/usr/bin/groovy(如果那是它的位置)。您正在查找的搜索字詞是shebang(這是第一行被稱爲的內容)。

+0

謝謝!我知道組合#!有特殊的名字,但我沒有記住它。 – Nulldevice 2011-03-30 11:24:00

+0

如果它可以幫助你記住,該行的起始符號是一個「尖銳的」**#**和一個interrobang **!**,因此術語「shebang」。 – mfortner 2015-02-08 00:04:29

+0

@mfortner一個很好的助記符,但感嘆號是一個爆炸聲,而不是一個音調。 [interrobang](https://en.wikipedia.org/wiki/Interrobang)是組合感嘆號/問號符號(‽)。 – 2017-02-07 15:37:12

1

一種常見的伎倆是寫一個腳本,已經在一種以上語言的意思,也被稱爲「多語種」的腳本。

在bash和Groovy的情況下,這是特別容易的:

#!/bin/sh 
//bin/true; exec groovy -cp .. "$0" 

println "Hello from Groovy" 
  1. 的第一行是一個認領(#!),它告訴OS來運行該腳本作爲常規外殼腳本。
  2. 第二行,當由shell執行時,調用/bin/true命令(無操作);然後在PATH中找到groovy可執行文件並在腳本文件本身上運行它("$0")以及其他參數,替換當前的shell進程(exec
  3. Groovy將忽略第一行,因爲它是一個shebang;它會忽略第二行,因爲它是一條評論(//),並且會運行腳本的其餘部分。

如果您需要更精細的外殼部分,可能建立的環境變量,或發現安裝了Groovy的地方,你可以使用不同的技巧:

#!/bin/sh 
'''': 
echo Hello from Shell 
exec groovy -cp .. "$0" 
''' 

println "Hello from Groovy" 
  1. 再次,家當信號操作系統開始執行這個文件作爲shell腳本。
  2. shell將'''':解析爲兩個空字符串''後跟一個冒號,這是一個空操作符。
  3. 外殼將執行該文件的其餘部分,一行行,直到它找到一個execexit
  4. 如果一切正常,shell將運行該腳本文件本身("$0"
  5. Groovy的命令
  6. Groovy將跳過shebang行,然後它將解析'''':作爲長字符串'''的開頭,從而跳過所有shell命令,然後運行腳本的其餘部分。