bash和linux内核中的Shebang行限制

bash和linux内核中的Shebang行限制,linux,bash,shebang,Linux,Bash,Shebang,我试图执行由zc.buildout自动生成的python脚本,所以我无法控制它们。我的问题是shebang行(#!)对于bash(80个字符的限制)或直接执行(一些我不知道的Linux内核常量)来说太长 这是一个帮助您重现我的问题的示例脚本: #!/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.

我试图执行由zc.buildout自动生成的python脚本,所以我无法控制它们。我的问题是shebang行(#!)对于bash(80个字符的限制)或直接执行(一些我不知道的Linux内核常量)来说太长

这是一个帮助您重现我的问题的示例脚本:

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

如何将bash或内核配置为允许更大的shebang行?

由于内核编译时缓冲区限制,99.9%的系统限制为127个字符


它在内核中受到
BINPRM\u BUF\u SIZE
的限制,设置在
include/linux/binfmts.h

如果您不想重新编译内核以获得更长的shebang行,您可以编写一个包装器:

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

然后运行如下脚本:
wrapper.sh script.sh

更新了@glenn jackman的脚本以支持传入命令行参数

顺便说一句,我在非常深的目录层次结构中创建python virtualenv时遇到了这个问题

在我的例子中,这是一个在Mesos框架中创建的virtualenv

超长的shebang使得调用
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" "${@}"

如果您将脚本作为参数传递给解释器(
bash x.sh
,而不是
/x.sh
),则shebang行将作为注释被忽略,不会影响执行。我知道,问题是我也不是调用这些脚本的人……另请参见
man execve
:“A#中的第一行允许的最大行长为127个字符!可执行外壳脚本。“+1简单的解决方法,无需任何内核更改、补丁或其他黑客操作即可解决所有问题。能否详细说明如何将此脚本用于虚拟环境?我们的构建在虚拟环境的初始创建过程中失败,因为easy#u安装的路径已经太长。