bash 和 Linux 内核中的 Shebang 行限制
- 2024-11-01 08:41:00
- admin 原创
- 39
问题描述:
我正在尝试执行 zc.buildout 自动生成的 python 脚本,因此我无法控制它们。我的问题是 shebang 行 (#!) 对于 bash(80 个字符限制)或直接执行(我不知道的一些 Linux 内核常量)来说太长了。
这是一个帮助您重现我的问题的示例脚本:
#!/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././bin/bash
echo Hola!
如何配置 bash 或内核以允许更大的 shebang 行?
解决方案 1:
由于内核编译时间缓冲区限制,99.9% 的系统上限制为 127 个字符。
它在内核中受到 的限制BINPRM_BUF_SIZE
,在 中设置include/linux/binfmts.h
。
解决方案 2:
如果你不想重新编译你的内核来获得更长的 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
解决方案 3:
更新了@glenn jackman 的脚本以支持传递命令行参数。
顺便说一句,我在一个非常深的目录层次结构中创建 python virtualenv 时遇到了这个问题。
就我而言,这是一个在 Mesos 框架目录中创建的虚拟环境。
额外的长距离通话使得呼叫变得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" "${@}"
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD