私は(私が思っていたものを)書くシンプルなbashスクリプトを書こうとしています:
ステップ1は非常にうまく機能しますが、virtualenvをアクティブにできないようです。 virtualenvに慣れていない人のために、仮想環境をアクティブにするactivate
ファイルを作成します。 CLIから、source
を使用して実行します
source $env_name/bin/activate
ここで、明らかに$ env_nameは、仮想envがインストールされているディレクトリの名前です。
私のスクリプトでは、仮想環境を作成した後、次のようにアクティベートスクリプトへのパスを保存します。
activate="`pwd`/$ENV_NAME/bin/activate"
しかし、source "$activate"
を呼び出すと、次のようになります。
/home/clawlor/bin/scripts/djangoenv: 20: source: not found
$activate
にはアクティベートスクリプトへの正しいパスが含まれていることを知っています。実際、source
を呼び出す前にファイルがあることをテストします。しかし、source
自体はそれを見つけられないようです。また、CLIですべての手順を手動で実行してみましたが、すべて正常に動作します。
私の研究では このスクリプト が見つかりました。これは、私が望むものに似ていますが、仮想環境のすべてを〜/に保存するなど、必要のない他の多くのことも行っています。 virtualenvディレクトリ(または$ WORKON_HOMEにあるもの)。しかし、彼はactivate
へのパスを作成し、source "$activate"
を基本的に同じ方法で呼び出しているようです。
スクリプト全体は次のとおりです。
#!/bin/sh
PYTHON_PATH=~/bin/python-2.6.1/bin/python
if [ $# = 1 ]
then
ENV_NAME="$1"
virtualenv -p $PYTHON_PATH --no-site-packages $ENV_NAME
activate="`pwd`/$ENV_NAME/bin/activate"
if [ ! -f "$activate" ]
then
echo "ERROR: activate not found at $activate"
return 1
fi
source "$activate"
else
echo 'Usage: djangoenv ENV_NAME'
fi
免責事項:私のbash script-fuはかなり弱いです。私はCLIにかなり慣れていますが、これが機能しないという非常に愚かな理由があるかもしれません。
Bashスクリプトを作成している場合は、名前で呼び出します。
#!/bin/bash
/ bin/shはbashであるとは限りません。これにより、数年前にUbuntuで大量のスクリプトが破損しました(IIRC)。
ソースビルトインはbashで正常に動作します。ただし、ノーマンが示唆したようにドットを使用することもできます。
/bin/sh
が尊重するはずのPOSIX標準では、コマンドはsource
ではなく.
(単一のドット)です。 source
コマンドは、csh
に取り込まれたbash
- ismです。
試してみる
. $env_name/bin/activate
または、コードにPOSIX以外のbash
- ismが必要な場合は、#!/bin/bash
を使用します。
Ubuntuでsh scriptname.sh
を使用してスクリプトを実行すると、この問題が発生します。
代わりに./scriptname.sh
を使用してスクリプトを実行してみてください。