Linux在 Linux 上使用
在 Linux 上使用 #!/usr/bin/env command --argument
的 Shebang 行失敗
我有一個簡單的腳本:
#!/usr/bin/env ruby --verbose # script.rb puts "hi"
在我的 OSX 機器上,它執行良好:
osx% ./script.rb hi
但是,在我的 linux 機器上,它會引發錯誤
linux% ./script.rb /usr/bin/env: ruby --verbose: No such file or directory
如果我手動執行 shebang 線,它可以正常工作
linux% /usr/bin/env ruby --verbose ./script.rb hi
但是如果我打包
ruby --verbose
成一個參數,我可以複製錯誤env
linux% /usr/bin/env "ruby --verbose" ./script.rb /usr/bin/env: ruby --verbose: No such file or directory
所以我認為這是如何
env
解釋shebang線的重置的問題。我正在使用 GNU coreutils 8.4env
:linux% /usr/bin/env --version env (GNU coreutils) 8.4 Copyright (C) 2010 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Written by Richard Mlynarik and David MacKenzie.
這看起來真的很奇怪。這是這個版本的常見問題
env
,還是這裡發生了我不知道的其他事情?
看起來這是因為 Linux(與 BSD 不同)僅將單個參數傳遞給 shebang 命令(在本例中為 env)。
通過@rampion 評論找到了這個:
發生的情況是核心處理文件的前兩個字元以查找#!。如果找到了,那麼它會跳過所有尋找非空格字元的空格字元並提取解釋器路徑,該路徑必須是真正的執行檔而不是另一個腳本,儘管 linux 擴展了它以允許遞歸腳本處理。發現之後,它會跳到第一個非空格字元,從那裡到下一個換行符,並將其作為單個參數傳遞給命令。引號或其他元字元沒有“外殼”處理。這一切都非常簡單和蠻力。因此,您無法對那裡的選項感到滿意。你得到了一個包含空格的參數,‘perl -w’ 是核心在這裡看到並傳遞的內容。
來源: http: //lists.gnu.org/archive/html/bug-sh-utils/2002-04/msg00020.html