Shebang限制在bash和linux内核中

sor*_*ega 26 linux bash shebang

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

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

#!/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././bin/bash
echo Hola!
Run Code Online (Sandbox Code Playgroud)

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

Ign*_*ams 31

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

它在内核中受到限制BINPRM_BUF_SIZE,设置为include/linux/binfmts.h.

  • 另请参阅`man execve`:"#!可执行shell脚本中第一行允许的最大行长度为127个字符." (7认同)

gle*_*man 12

如果您不想重新编译内核以获得更长的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[@]}" "$@"
Run Code Online (Sandbox Code Playgroud)

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


cod*_*rfi 9

更新了@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" "${@}"
Run Code Online (Sandbox Code Playgroud)

  • 你能详细说明你是如何在虚拟环境中使用这个脚本的吗?我们的构建在虚拟环境的初始创建期间失败,因为 #! easy_install 的路径已经太长了。 (2认同)