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には、複数の異なる言語のバイリンガルスクリプトがあります。

おすすめ記事