首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >bash和linux内核中的Shebang行限制

bash和linux内核中的Shebang行限制
EN

Stack Overflow用户
提问于 2012-05-30 17:29:55
回答 3查看 7.8K关注 0票数 31

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

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

代码语言:javascript
复制
#!/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././bin/bash
echo Hola!

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-30 17:35:18

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

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

票数 36
EN

Stack Overflow用户

发布于 2012-05-31 08:41:11

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

代码语言:javascript
复制
#!/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

票数 13
EN

Stack Overflow用户

发布于 2015-01-04 17:13:47

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

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

在我的例子中,这是在Mesos框架目录中创建的一个虚拟环境。

超长的shebang使得调用xxx/.../venv/bin/pip变得无用。

包装器脚本被证明是最有用的。

代码语言:javascript
复制
#!/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" "${@}"
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10813538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档