#! /usr/bin/env ruby
和#! ruby
有什麼區別?/usr/bin/env有什麼影響?
(我發現很多討論#! /usr/bin/env ruby
和#! /usr/bin/ruby
之間的區別的其他問題,但是這不是我的問題。)
#! /usr/bin/env ruby
和#! ruby
有什麼區別?/usr/bin/env有什麼影響?
(我發現很多討論#! /usr/bin/env ruby
和#! /usr/bin/ruby
之間的區別的其他問題,但是這不是我的問題。)
#! ruby
...不能保證在類UNIX系統系統的工作(和不工作根據我個人所知);一個有效的shebang必須有一個完全合格的路徑。告訴你的編輯器你正在使用哪種編程語言可能就足夠了,但這並不意味着內核會成功地使用它來選擇一個運行程序的解釋器。
內核的系統調用execve
不做PATH查找 - 這是由C-標準庫的包裝,如execlp
和execvp
添加,但解析shebangs由內核直接完成,所以你的C庫nicities不發生在那裏。
#!/usr/bin/env ruby
...使用路徑來查找ruby
可執行文件的位置。因爲完整指定env
可執行文件的路徑,所以這是一個有效的shebang行(不是#! ruby
)。
env
有其他目的 - 你可以運行,例如,env -i someprog
與一個完全空的環境中運行someprog
,或env FOO=bar someprog
與環境變量運行someprog
FOO
設置爲值bar
(其中FOO=bar someprog
如果通過shell運行也可以,但env
方法也可以在不涉及shell的情況下運行)。
但是,在這種情況下的相關用例強制PATH查找。
'#!紅寶石必須在你的道路上。所以'#! ruby和'#!/ usr/bin/ruby'可能是同一件事情,具體取決於你的路徑。 –
實際上,我只是做了一個測試,作爲根在哪裏'#! ruby'導致了「ruby:糟糕的解釋器:沒有這樣的文件或目錄」......所以出於某種原因,ruby並不是自然而然地存在於根環境中,但是/ usr/bin/env可以找到它。但我認爲/ user/bin/env應該使用用戶的路徑... –
嗯實際上它看起來像'#!紅寶石必須是一個特例,因爲'#! python'將不起作用,因爲*解釋器必須是可執行文件的有效路徑名* - 請參閱[關於shebang的更多信息;爲什麼不##python工作?](http://askubuntu.com/a/716281/272194) –