2012-05-30 29 views
20

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

これは、あなたが私の問題を再現するのに役立つサンプルスクリプトです:bashや大きなシェバングラインに許可するように設定することができ、カーネルはどのよう

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

+1

スクリプトをインタプリタ( '。/ x.sh'ではなく' bash x.sh')に引数として渡すと、シバン行はコメントとして無視され、実行に影響しません。 –

+0

私は、問題は私がそれらのスクリプトを呼び出すものではないということです... – sortega

答えて

27

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

カーネルでは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" 

などのスクリプトを実行します:

+7

'man execve'も参照してください:"#!実行可能シェルスクリプトの最初の行に最大行長127文字が許されています" –

10

あなたが長いシェバング行を取得するには、カーネルを再コンパイルしたくない場合は、ラッパーを書くことができwrapper.sh script.shジャックマンのスクリプト@glenn更新

+0

+1簡単な回避策は、カーネルの変更、パッチやその他のハッキングを必要とせずにすべての問題を解決します。 –

6

コマンドライン引数を渡すことをサポートします。

ちなみに、非常に深いディレクトリ階層内に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" "${@}" 
+1

virtual envでこのスクリプトをどのように使用しているかを詳しく説明できますか?仮想環境の最初の作成時にビルドに失敗します。#! easy_installへのパスがすでに長すぎます。 – Blaskovicz

関連する問題