web-dev-qa-db-ja.com

bashスクリプトでソースを使用しているときに「ソース:見つかりません」というエラーを取得する

私は(私が思っていたものを)書くシンプルな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 script-fuはかなり弱いです。私はCLIにかなり慣れていますが、これが機能しないという非常に愚かな理由があるかもしれません。

145
Chris Lawlor

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

#!/bin/bash

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

ソースビルトインはbashで正常に動作します。ただし、ノーマンが示唆したようにドットを使用することもできます。

218
guns

/bin/shが尊重するはずのPOSIX標準では、コマンドはsourceではなく.(単一のドット)です。 sourceコマンドは、cshに取り込まれたbash- ismです。

試してみる

. $env_name/bin/activate

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

169
Norman Ramsey

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

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

26
Madhu