web-dev-qa-db-ja.com

シェルスクリプトで仮想環境をアクティブにできない

同様の質問を読んで提案を試しましたが、仮想環境をまだアクティブにできません。ディレクトリの階層は次のとおりです。

myproject
-- virtualenv
-- startvenv.sh

startvenv.shは次のとおりです。

#!/bin/bash
source virtualenv/bin/activate

そして、私はstartvenv.shを実行しています:

./startvenv.sh

エラーはありませんが、何も起こりません。どうして?理想的には、新しいターミナルを開き、そこで仮想環境をアクティブにしたいです。

6
Heuyie

Virtualenvは、virtualenv/bin/activateスクリプトをsourcing(通常は実行されていない)でアクティブにします。独自のスクリプトでこれを実行する場合は、実行するだけでなく、そのスクリプトもsourceにする必要があります。意味:

source startvenv.sh

実行とソーシングの違いは、実行すると、親シェル(呼び出し元のシェル)から分離された独自のサブシェルでスクリプトが実行されることです。スクリプト内の環境変数およびその他の変更は、親に伝播されません。

ソーシングはそれを明示的に行い、currentシェルでスクリプトを実行します。これにより、終了後に環境変数などへのすべての変更がそのまま残ります。

man bash(Shell Builtinsに関するセクション)からの抜粋を以下に示します。

    .  filename [arguments]
   source filename [arguments]
          Read and execute commands from filename  in  the  current  Shell
          environment  and return the exit status of the last command exe‐
          cuted from filename.  [ ... ]
7
Byte Commander