2011-04-05 66 views

回答

14

#!<interpreter> <arguments>試圖運行<interpreter> <arguments>來讀取並運行文件的其餘部分。

所以#!/usr/bin/env意味着必須有一個叫做/usr/bin/env的程序;
#!/bin/env表示必須有一個名爲/bin/env的程序。

一些系統有一個而不是另一個。

以我的經驗,大部分都有/usr/bin/env,所以#!/usr/bin/env比較常見。

Unix系統將嘗試使用execve運行<interpreter>,這就是爲什麼它必須是完整路徑,而沒有路徑的#!env將不起作用。

+1

除此之外,非OSX BSD沒有'/ bin/bash',所以推薦'/ usr/bin/env'來實現可移植性。另外,如果你想在'$ PATH'中排隊的不同目錄中運行更新版本的BASH,'env'會尊重和使用它,而'/ bin/bash'顯然是硬編碼的。 – kvz 2013-04-19 11:22:07

+3

特別是,OS/X具有'/ usr/bin/env',並且沒有'/ bin/env'到'/ usr/bin/env'的符號鏈接。你會得到一個'-bash:./your_commnd:/ bin/env:壞解釋器:沒有這樣的文件或目錄錯誤。 – 2013-05-22 21:57:22

1

/usr/bin/env是到/bin/env的軟鏈接。從本質上講,你正在使用/bin/env

+4

取決於系統。 – 2011-04-05 14:43:27

+0

哪個系統具有兩個硬文件? – kurumi 2011-04-05 15:49:41

+5

Ubuntu沒有/ bin/env。 Solaris 8分別具有兩個文件。 – 2011-04-05 16:02:16

2

米克爾的解釋是偉大的,它錯過只是一個小的事實(這是相當重要的),這只是一個傳遞包括所有空間的說法:

#!<Interpreter> <argument> 

結果在呼喚:

$ <Interpreter> '<argument>' path_to_calling_script 

因此,例如:

$ cat /tmp/test 
#!/usr/bin/env python 
print "hi" 

$ /tmp/test 

是與調用:

$ /usr/bin/env "python" /tmp/test 

的報價嘗試表明,如果你添加任何標誌或其他值將是參數的一部分被調用。

#!/bin/bash -c /bin/env python 

將被解釋爲:

$ /bin/bash "-c /bin/env python" 

這將無法正常工作。