2012-05-30 9 views
20

Próbuję wykonać skrypty Pythona automatycznie wygenerowane przez Zc.buildout, więc nie mam nad nimi kontroli. Mój problem polega na tym, że linia shebang (#!) Jest zbyt długa na bash (limit 80 znaków) lub na bezpośrednie wykonanie (pewna stała jądra Linuksa, której nie znam).Limit linii Shebang w bashu i jądrze Linuksa

To jest przykładowy skrypt, aby pomóc odtworzyć mój problem:

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

Jak może być bash lub kernel skonfigurowany, aby umożliwić większych linii shebang?

+1

Jeśli zdasz skrypt jako argument do interpretera ('bash x.sh' zamiast'./X.sh') linia shebang po prostu ignorowane jako komentarz i nie powinno mieć wpływu na wykonanie . –

+0

Wiem, problem polega na tym, że nie jestem tym, który wywołuje te skrypty ... – sortega

Odpowiedz

27

Ograniczona do 127 znaków w 99,9% systemów z powodu limitu bufora czasu kompilacji jądra.

Jest ograniczony w jądrze przez BINPRM_BUF_SIZE, ustawiony w include/linux/binfmts.h.

+7

Zobacz także 'man execve':" Maksymalna długość linii wynosząca 127 znaków jest dozwolona dla pierwszej linii w wykonywalnym skrypcie powłoki #! . " –

10

Jeśli nie chce skompilować jądro, aby uzyskać dłuższe linie shebang, można napisać otoki:

#!/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" 

a następnie uruchomić skrypt jak: wrapper.sh script.sh

+0

+1 Proste obejście, które rozwiązuje wszystkie problemy bez potrzeby zmiany jądra, poprawek lub innych hacków. –

6

skryptu aktualizowane @glenn Jackmana do obsługi przekazywania w argumentach linii poleceń.

Nawiasem mówiąc, wpadł mi na ten problem podczas tworzenia Pythona virtualenv wewnątrz bardzo głębokiej hierarchii katalogów.

W moim przypadku był to virtualenv stworzony w ramach programu Mesos w reż.

Dodatkowy długi shebang renderowany dzwoniąc pod numer xxx/.../venv/bin/pip bezużyteczny.

Skrypt otoki okazał się najbardziej przydatny.

#!/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

Czy możesz wyjaśnić, w jaki sposób używasz tego skryptu z wirtualnym środowiskiem? Nasza kompilacja kończy się niepowodzeniem podczas początkowego tworzenia wirtualnego środowiska, ponieważ #! ścieżka do easy_install jest już zbyt długa. – Blaskovicz

Powiązane problemy