168

私は(私が思っていたように)次のような単純なbashスクリプトを書き込もうとしています。

  1. virtualenvを実行して、$1で新しい環境を作成します
  2. 仮想環境をアクティブ化する
  3. さらにいくつかのことを行います(djangoをインストールする、virtualenvのパスにdjango-admin.pyを追加するなど)

ステップ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スクリプト-fuはかなり弱いです。私はCLIにかなり慣れていますが、これが機能しない非常に愚かな理由があるかもしれません。

4

3 に答える 3

244

bashスクリプトを作成している場合は、名前で呼び出します。

#!/bin/bash

/ bin/shがbashであるとは限りません。これにより、数年前のUbuntu(IIRC)で大量のスクリプトが壊れていました。

ソースビルトインはbashで問題なく動作します。しかし、ノーマンが提案したようにドットを使用する方がよいでしょう。

于 2009-03-21T23:30:46.553 に答える
201

/bin/sh尊重することになっているPOSIX標準では、コマンドは.(単一のドット)であり、ではありませんsourcesourceコマンドは、に引き込まれた-ismcshですbash

試す

. $env_name/bin/activate

bashまたは、コードにPOSIX以外のイズムが必要な場合は、を使用します#!/bin/bash

于 2009-03-21T23:25:03.773 に答える
36

Ubuntu でスクリプトを実行すると、sh scriptname.shこの問題が発生します。

./scriptname.sh代わりにスクリプトを実行してみてください。

于 2010-09-21T05:20:22.757 に答える