在bash和linux内核中,shebang行限制

我试图执行由zc.buildout自动生成的Python脚本,所以我没有控制他们。 我的问题是,shebang行(#!)太长,无论是bash(80个字符的限制)还是直接执行(一些Linux内核常量我都不知道)。

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

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

如何configurationbash或内核以允许更大的shebang行?

它在内核中由BINPRM_BUF_SIZE ,在include/linux/binfmts.h

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

 #!/bin/bash script="$1" shebang=$(head -1 "$script") interp=( ${shebang#\#!} ) # use an array in case a argument is there too # now run it exec "${interp[@]}" "$script" 

然后运行脚本,如: 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" "${@}" 

您可以通过sed传递脚本来缩短shebang行:

 sed -i.bak -E '1s|(/\.)+/|/|g' script.sh 

这应该在脚本的第一行折叠每个/.//