Shebang line limit in bash and linux kernel

前端 未结 3 493
没有蜡笔的小新
没有蜡笔的小新 2020-11-30 09:32

I\'m trying to execute python scripts automatically generated by zc.buildout so I don\'t have control over them. My problem is that the shebang line (#!) is too long for ei

相关标签:
3条回答
  • 2020-11-30 10:10

    Updated @glenn jackman's script to support passing in command line arguments.

    Incidentally, I ran into this problem when creating a python virtualenv inside of a very deep directory hierarchy.

    In my case, this was a virtualenv created inside a Mesos framework dir.

    The extra long shebang rendered calling xxx/.../venv/bin/pip useless.

    The wrapper script proved most useful.

    #!/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" "${@}"
    
    0 讨论(0)
  • 2020-11-30 10:19

    If you don't want to recompile your kernel to get longer shebang lines, you could write a wrapper:

    #!/bin/bash
    
    if [[ $# -eq 0 ]]; then
        echo "usage: ${0##*/} script [args ...]"
        exit
    fi
    
    # we're going to expand a variable *unquoted* to use word splitting, but
    # we don't want to have path expansion effects, so turn that off
    set -f
    
    shebang=$(head -1 "$1")
    if [[ $shebang == '#!'* ]]; then
        interp=( ${shebang#\#!} )        # use an array in case a argument is there too
    else
        interp=( /bin/sh )
    fi
    
    # now run it
    exec "${interp[@]}" "$@"
    

    and then run the script like: wrapper.sh script.sh

    0 讨论(0)
  • 2020-11-30 10:24

    Limited to 127 chars on 99.9% of systems due to kernel compile time buffer limit.

    It's limited in the kernel by BINPRM_BUF_SIZE, set in include/linux/binfmts.h.

    0 讨论(0)
提交回复
热议问题