bashスクリプトでソースを使用すると「ソース:見つかりません」エラーが発生する


159

私は(私が思っていたものと思われる)簡単なbashスクリプトを書こうとしています:

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

ステップ1はかなりうまく機能しますが、virtualenvをアクティブ化できないようです。virtualenvに慣れていない場合はactivate、仮想環境をアクティブにするファイルを作成します。CLIから、次を使用して実行しますsource

source $env_name/bin/activate

$ env_nameは、明らかに、仮想環境がインストールされているディレクトリの名前です。

私のスクリプトでは、仮想環境を作成した後、次のようにアクティベートスクリプトへのパスを保存します。

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でかなり快適ですが、これが機能しない非常に愚かな理由がある可能性があります。

回答:


230

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

#!/bin/bash

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

ソースビルトインはbashでうまく動作します。しかし、ノーマンが提案したように、ドットを使用することもできます。


この解決策は、もともとノーマン・ラムジーの回答のコメントでした。これが実際に問題を修正したものなので、これを「受け入れられた答え」に変更しました
Chris Lawlor

185

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

試す

. $env_name/bin/activate

またはbash、コードに非POSIX 主義を含める必要がある場合は、を使用します#!/bin/bash


1
それはそれを修正します。(/ bin / shを/ bin / bashに変更)。何らかの理由で、スクリプトの終了時にCLIで環境がアクティブ化されませんが、それは小さな問題です。
Chris Lawlor

8
Bashマニュアルに よるsourceと、の同義語です.
Richard Hansen、

1
このようなエントリポイントを持つDockerコンテナーを使用しているときにこれに遭遇しました/bin/sh -c '/path/to/script.sh'。私のスクリプトはbashスクリプトでしたが、ソースはエクスポートのソースに失敗しました。だが "。" 働いた!
Nikhil Owalekar 2018

31

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

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


これを行うとセグメンテーション違反が発生しました。
最大プレナー16年

1
ファイルは実行可能でなければなりません:chmod +x filename.sh
Randy

2
これはなぜですか?
Yuval Adam

私のUbuntu 20.04で機能した唯一のもの
Kirill_Zaitsev
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.