32

zc.buildoutによって自動的に生成されたPythonスクリプトを実行しようとしているので、それらを制御できません。私の問題は、シバン行(#!)がbash(80文字の制限)または直接実行(私が知らないLinuxカーネル定数)のいずれにも長すぎることです。

これは、私の問題を再現するのに役立つサンプルスクリプトです。

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

より大きなシバンラインを可能にするようにbashまたはカーネルをどのように構成できますか?

4

3 に答える 3

36

カーネルコンパイル時のバッファ制限により、システムの99.9%で127文字に制限されています。

カーネルではBINPRM_BUF_SIZE、に設定されたによって制限されinclude/linux/binfmts.hます。

于 2012-05-30T09:35:17.703 に答える
13

カーネルを再コンパイルしてより長いシバン行を取得したくない場合は、ラッパーを作成できます。

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

于 2012-05-31T00:41:11.023 に答える
10

コマンドライン引数の受け渡しをサポートするように@glennjackmanのスクリプトを更新しました。

ちなみに、非常に深いディレクトリ階層内にpython virtualenvを作成するときに、この問題が発生しました。

私の場合、これはMesosフレームワークディレクトリ内に作成されたvirtualenvでした。

非常に長いシバンは、呼び出しを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" "${@}"
于 2015-01-04T09:13:46.800 に答える