1. ホーム
  2. bash

[解決済み] bashスクリプトでsourceを使用すると、「source: not found」エラーが発生します。

2022-03-13 11:25:44

質問

私は、簡単なbashスクリプトを書こうとしています。

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

ステップ1はうまくいったのですが、virtualenvを有効にすることができないようです。virtualenvに慣れていない人のために説明すると、virtualenvは activate ファイルを作成し、仮想環境を有効にします。CLIから実行する場合は source

source $env_name/bin/activate

ここで、$env_name は明らかに仮想環境のインストール先ディレクトリの名前です。

私のスクリプトでは、仮想環境を作成した後、activateスクリプトへのパスを次のように格納しています。

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スクリプトの腕前はかなり弱いです。CLIではかなり快適なのですが、これがうまくいかないのは何か非常に馬鹿げた理由があるのかもしれません。

解決するには?

bashスクリプトを書く場合は、名前を付けて呼び出す。

#!/bin/bash

/bin/shはbashであることを保証するものではありません。何年か前にUbuntuで壊れたスクリプトが大量に発生したのはこのせいです(IRC)。

ソースビルトインはbashで問題なく動作します。しかし、Normanが提案したように、dotを使用したほうがいいかもしれません。