2016-09-06 71 views
1

#! /usr/bin/env ruby#! ruby有什麼區別?/usr/bin/env有什麼影響?

(我發現很多討論#! /usr/bin/env ruby#! /usr/bin/ruby之間的區別的其他問題,但是這不是我的問題。)

+0

'#!紅寶石必須在你的道路上。所以'#! ruby和'#!/ usr/bin/ruby​​'可能是同一件事情,具體取決於你的路徑。 –

+0

實際上,我只是做了一個測試,作爲根在哪裏'#! ruby'導致了「ruby:糟糕的解釋器:沒有這樣的文件或目錄」......所以出於某種原因,ruby並不是自然而然地存在於根環境中,但是/ usr/bin/env可以找到它。但我認爲/ user/bin/env應該使用用戶的路徑... –

+1

嗯實際上它看起來像'#!紅寶石必須是一個特例,因爲'#! python'將不起作用,因爲*解釋器必須是可執行文件的有效路徑名* - 請參閱[關於shebang的更多信息;爲什麼不##python工作?](http://askubuntu.com/a/716281/272194) –

回答

2
#! ruby 

...不能保證在類UNIX系統系統的工作(和工作根據我個人所知);一個有效的shebang必須有一個完全合格的路徑。告訴你的編輯器你正在使用哪種編程語言可能就足夠了,但這並不意味着內核會成功地使用它來選擇一個運行程序的解釋器。

內核的系統調用execve不做PATH查找 - 這是由C-標準庫的包裝,如execlpexecvp添加,但解析shebangs由內核直接完成,所以你的C庫nicities不發生在那裏。


#!/usr/bin/env ruby 

...使用路徑來查找ruby可執行文件的位置。因爲完整指定env可執行文件的路徑,所以這是一個有效的shebang行(不是#! ruby)。


env有其他目的 - 你可以運行,例如,env -i someprog與一個完全空的環境中運行someprog,或env FOO=bar someprog與環境變量運行someprogFOO設置爲值bar(其中FOO=bar someprog如果通過shell運行也可以,但env方法也可以在不涉及shell的情況下運行)。

但是,在這種情況下的相關用例強制PATH查找。