2012-05-30 41 views
20

我試圖執行由zc.buildout自動生成的python腳本,所以我沒有控制它們。我的問題是,shebang行(#!)對於bash(80個字符的限制)或直接執行(我不知道的一些Linux內核常量)來說太長。bash和linux內核中的shebang行限制

這是一個示例腳本,以幫助您重現我的問題:

#!/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././bin/bash 
echo Hola! 

怎麼能bash或配置爲允許更大的家當線的內核?

+1

如果您通過腳本作爲參數傳遞給解釋('慶典x.sh'而不是'/ x.sh')的家當線也只是被忽略爲註釋並不會影響執行。 –

+0

我知道,問題是我不是那個調用這些腳本的人...... – sortega

回答

27

由於內核編譯時緩衝區限制,在99.9%的系統上限制爲127個字符。

它在內核中的限制爲BINPRM_BUF_SIZE,設置在include/linux/binfmts.h

+7

另請參閱'man execve':「#!可執行shell腳本的第一行允許的最大行長度爲127個字符「。 –

10

如果你不想重新編譯內核來獲得更長的家當線,你可以寫一個包裝:

#!/bin/bash 
script="$1" 
shebang=$(head -1 "$script") 
interp=(${shebang#\#!})  # use an array in case a argument is there too 
# now run it 
exec "${interp[@]}" "$script" 

,然後運行像腳本:wrapper.sh script.sh

+0

+1簡單的解決方法,無需任何內核更改,修補程序或其他黑客即可解決所有問題。 –

6

更新@glenn傑克曼的腳本支持傳入命令行參數。

順便提一句,我在深層目錄層次結構中創建python virtualenv時遇到了這個問題。

就我而言,這是一個在Mesos框架目錄中創建的virtualenv。

額外的長she rendered致使xxx/.../venv/bin/pip無用。

包裝器腳本證明最有用。

#!/usr/bin/env bash 

script="$1" 
shebang=$(head -1 "$script") 

# use an array in case a argument is there too 
interp=(${shebang#\#!})   

# now run it, passing in the remaining command line arguments 
shift 1 
exec "${interp[@]}" "$script" "${@}" 
+1

你能詳細說明你如何使用這個腳本與虛擬env?我們的構建在初始創建虛擬環境時失敗,因爲#! easy_install的路徑已經太長了。 – Blaskovicz