Shebangで環境変数をどのように使用しますか?

Shebangで環境変数をどのように使用しますか?

特定のPythonインストールで実行する必要があるPythonスクリプトがあります。 shebangで実行する方法はありますか$FOO/bar/MyCustomPython

答え1

Shebangラインは非常に限られています。多くのUNIXバリアント(Linuxを含む)では、コマンドと引数という2つの単語しかありません。通常、長さ制限もあります。

一般的な解決策は、小さなシェルラッパーを書くことです。 Pythonスクリプトに名前を付けて、foo.pyその横にシェルスクリプトを置いてfoo.py呼び出しますfoo。この方法では、Pythonスクリプトに特定のヘッダーは必要ありません。

#!/bin/sh
exec "$FOO/bar/MyCustomPython" "$0.py" "$@"

もう一つの魅力的なアプローチは、上記のようなラッパースクリプトを作成して、#!/path/to/wrapper/scriptPythonスクリプトの上にshebang行に配置することです。ただし、ほとんどの unices は shebang スクリプト接続をサポートしていないため、機能しません。

MyCustomPythonにいる場合は、以下を使用して見つけることができ$PATHますenv

#!/usr/bin/env MyCustomPython
import …

もう1つのアプローチは、スクリプトを有効なシェルスクリプト(自動的に正しいPythonインタプリタをロードする)とターゲット言語(ここではPython)の有効なスクリプトにソートすることです。これを行うには、ターゲット言語用のバイリンガルスクリプトを作成する方法を見つける必要があります。 Perlではこれをこう呼んでいます。if $running_under_some_shell

#!/bin/sh
eval 'exec "$FOO/bar/MyCustomPerl" -wS $0 ${1+"$@"}'
    if $running_under_some_shell;
use …

Pythonで同じ効果を得る1つの方法は次のとおりです。シェルは、その引数(2つの単一文字文字列の合計)を無視して真の値を返すユーティリティ"true"です。 Pythonでは、ブール値として解釈されたときに真の文字列なので、常に真で文字列リテラルを実行するコマンドです。true:'"true"if

#!/bin/sh
if "true" : '''\'
then
exec "$FOO/bar/MyCustomPython" "$0" "$@"
exit 127
fi
'''
import …

Rosetta Codeには、複数の異なる言語のバイリンガルスクリプトがあります。

答え2

$FOO/MyCustomPythonShebang行は変数拡張を行わず、Dollar-FOO-....という実行ファイルを検索するため使用できません。

別のアプローチは、シェバンがシェルスクリプトをインタプリタとして指すようにすることです。これにより、シェルスクリプトは環境変数を使用して正しいスクリプトを見つけて実行できます。

mypython.sh例:次の内容を使用して(またはユーザーの他のディレクトリ)にスクリプトを作成します。/usr/local/bin$PATH

#! /bin/sh
PYTHON="$FOO/bar/MyCustomPython"
exec "$PYTHON" "$@"

MyCustomPythonその後、このShebang行を使用して次のようにPythonスクリプトを実行できますmypython.sh

#!/usr/bin/env mypython.sh

答え3

カスタムPythonインストールの絶対パスを使用するか、それをユーザーパスに配置して$PATH使用できます#!/usr/bin/env [command]。それ以外の場合は、ラッパーを作成し、それを使用してexecプロセスイメージを置き換えます。例:

#!/bin/bash
exec "$ENV/python" "$@"

答え4

$FOOinを特定のパスオプションに置き換えることができる場合は、$FOO/bar/MyCustomPythonそのパスに直接envカスタムラインを設定して、カスタムPythonバージョンを見つける場所をshebangに通知できます。PATH

#!/usr/bin/env PATH="/path1/to/MyCustomPython:/path2/to/MyCustomPython" python

編集する:PATH値の割り当てに引用符がない場合にのみ機能するようです。

#!/usr/bin/env PATH=/path1/to/MyCustomPython:/path2/to/MyCustomPython python

関連情報