2016-08-19 9 views
0

ローカルの開発環境を自動化するシェルスクリプトを作成しようとしています。私はいくつかのプロセス(Redis、MongoDBなど)を開始し、環境変数を設定し、ローカルWebサーバーを起動する必要があります。私はOS X El Capitanに取り組んでいます。シェルスクリプトで環境変数を設定するOS X

これまで環境変数を除いてすべてが動作しています。 .envファイルは、環境変数はちょうどすべてで設定されていないexport VARIABLE="value"

形式を使用している

#!/bin/bash 

# Starting the Redis Server 
if pgrep "redis-server" > /dev/null 
then 
    printf "Redis is already running.\n" 
else 
    brew services start redis 
fi 

# Starting the Mongo Service 
if pgrep "mongod" > /dev/null 
then 
    printf "MongoDB is already running.\n" 
else 
    brew services start mongodb 
fi 

# Starting the API Server 
printf "\nStarting API Server...\n" 
source path-to-file.env 
pm2 start path-to-server.js --name="api" --watch --silent 

# Starting the Auth Server 
printf "\nStarting Auth Server...\n" 
source path-to-file.env 
pm2 start path-to-server.js --name="auth" --watch --silent 

# Starting the Client Server 
printf "\nStarting Local Client...\n" 
source path-to-file.env 
pm2 start path-to-server.js --name="client" --watch --silent 

:ここにスクリプトがあります。しかし、スクリプトを実行する前に正確なコマンドsource path-to-file.envを実行すると、それは機能します。私はなぜコマンドが独立して動作するのだろうと思っていますが、シェルスクリプト内では動作しません。

ご協力いただければ幸いです。

+0

このファイルには正確には何が入っていますか? 'echo $ -'は、動作するインタラクティブシェルと、動作しないスクリプトとをどのように比較しますか? –

+0

...最も可能性の高いシナリオは '〜/ .bashrc'やそれに類するもので' set -a'を実行しているということです。 –

+0

(妥当な期待を前提としています。すなわち、スクリプトが終了した後に変数を対話的に利用できるとは思わない)。 –

答えて

2

スクリプトを実行すると、スクリプトはサブシェルで実行され、サブシェルが終了するとその環境設定は失われます。スクリプトから対話型シェルを構成する場合は、対話シェルでスクリプトをsourceにする必要があります。

$ source start-local.sh 

これで、環境が対話型シェルに表示されます。その環境をサブシェルによって継承させたい場合は、必要な変数もexportにする必要があります。たとえば、path-to-file.envのような行は、次のような行が必要です。

export MY_IMPORTANT_PATH_VAR="/example/blah" 
+0

OP *はファイルをソースしています。私は、変数が後で呼び出される 'pm2'サービスの振る舞いを介して設定されているかどうかをチェックしていると仮定します。彼らが外殻で利用できるようにするつもりなら、それは明らかな期待の失敗です。 –

+0

シェルで 'echo $ -'を使って確認していますが、設定されていません。しかしこれは意味をなさない。それぞれのファイルを個別に調達することなく、私がやりたいことをする方法はありますか? – nickcorin

+1

スクリプト内に 'source'呼び出し*があります。スクリプト自体がインタラクティブシェルから提供されているという兆候はありません。 –

関連する問題