Shebang limite la ligne dans le kernel bash et linux

J’essaie d’exécuter des scripts python générés automatiquement par zc.buildout pour ne pas les contrôler. Mon problème est que la ligne shebang (#!) Est trop longue pour soit bash (limite de 80 caractères), soit exécution directe (certaines constantes du kernel Linux que je ne connais pas).

Ceci est un exemple de script pour vous aider à reproduire mon problème:

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

Comment peut-on bash ou le kernel configuré pour permettre de plus grandes lignes de shebang?

Limité à 127 caractères sur 99,9% des systèmes en raison de la limite du tampon de compilation du kernel.

C’est limité dans le kernel par BINPRM_BUF_SIZE , défini dans include/linux/binfmts.h .

Si vous ne voulez pas recomstackr votre kernel pour obtenir des lignes de shebang plus longues, vous pouvez écrire un wrapper:

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

puis lancez le script comme wrapper.sh script.sh : wrapper.sh script.sh

Mise à jour du script de @glenn jackman pour prendre en charge les arguments de ligne de commande.

Incidemment, j’ai rencontré ce problème lors de la création d’un Python Virtualenv dans une hiérarchie de répertoires très profonde.

Dans mon cas, c’était un virtualenv créé dans un répertoire de Mesos.

Le très long shebang a rendu les appels xxx/.../venv/bin/pip inutiles.

Le script de wrapper s’est avéré très utile.

 #!/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" "${@}"