Shebang line limit in bash and linux kernel

2019-01-09 08:54发布

I'm trying to execute python scripts automatically generated by zc.buildout so I don't have control over them. My problem is that the shebang line (#!) is too long for either bash (80 character limit) or direct execution (some Linux kernel constant I don't know).

This is an example script to help you reproduce my problem:

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

How can be bash or the kernel configured to allow for bigger shebang lines?

3条回答
对你真心纯属浪费
2楼-- · 2019-01-09 09:21

If you don't want to recompile your kernel to get longer shebang lines, you could write a wrapper:

#!/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"

and then run the script like: wrapper.sh script.sh

查看更多
老娘就宠你
3楼-- · 2019-01-09 09:31

Limited to 127 chars on 99.9% of systems due to kernel compile time buffer limit.

It's limited in the kernel by BINPRM_BUF_SIZE, set in include/linux/binfmts.h.

查看更多
叼着烟拽天下
4楼-- · 2019-01-09 09:31

Updated @glenn jackman's script to support passing in command line arguments.

Incidentally, I ran into this problem when creating a python virtualenv inside of a very deep directory hierarchy.

In my case, this was a virtualenv created inside a Mesos framework dir.

The extra long shebang rendered calling xxx/.../venv/bin/pip useless.

The wrapper script proved most useful.

#!/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" "${@}"
查看更多
登录 后发表回答