meaning linux bash shebang

linux - shebang meaning



Límite de línea Shebang en bash y kernel de Linux (4)

Está limitado en el kernel por BINPRM_BUF_SIZE , establecido en include/linux/binfmts.h .

Estoy intentando ejecutar scripts de Python generados automáticamente por zc.buildout, por lo que no tengo control sobre ellos. Mi problema es que la línea de shebang (#!) Es demasiado larga para bash (límite de 80 caracteres) o ejecución directa (algo de kernel de Linux no sé).

Este es un script de ejemplo para ayudarlo a reproducir mi problema:

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

¿Cómo se puede configurar bash o kernel para permitir líneas de shebang más grandes?


Podría pasar los scripts a través de sed para acortar la línea de shebang:

sed -i.bak -E ''1s|(//.)+/|/|g'' script.sh

Esto debería colapsar cada /./ a / en la primera línea del script.


Si no desea recompilar su kernel para obtener líneas Shebang más largas, podría escribir un contenedor:

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

y luego ejecute el script como: wrapper.sh script.sh


Se actualizó la secuencia de comandos de @glenn jackman para admitir el paso de argumentos de línea de comando.

Incidentalmente, me encontré con este problema al crear una virtualenv de python dentro de una jerarquía de directorios muy profunda.

En mi caso, este fue un virtualenv creado dentro de un directorio de Mesos.

El shebang extra largo hace que llamar a xxx/.../venv/bin/pip inútil.

El script de envoltura resultó ser muy útil.

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