2016-08-19 2 views
0

Я пытаюсь создать сценарий оболочки для автоматизации локальной локальной среды. Мне нужно запустить некоторые процессы (Redis, MongoDB и т. Д.), Установить переменные окружения, а затем запустить локальный веб-сервер. Я работаю над OS X El Capitan.Настройка переменных среды в сценарии оболочки OS X

Все работает до сих пор, кроме переменных окружения. Вот сценарий:

#!/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 

Файл .env использует формат export VARIABLE="value"

Переменные окружения просто не установлен вообще. Но, если я запускаю точную команду source path-to-file.env перед запуском скрипта, тогда она работает. Мне интересно, почему команда будет работать независимо, но не внутри сценария оболочки.

Любая помощь будет оценена по достоинству.

+0

Что именно находится в этом файле? Как «echo $-» сравнивается между вашей интерактивной оболочкой, где она работает, и скриптом, где это не так? –

+0

... наиболее вероятным сценарием является то, что вы запускаете 'set -a' в' ~/.bashrc' или аналогичном. –

+0

(предполагая разумные ожидания - то есть вы не ожидаете, что переменные будут доступны в интерактивном режиме после выхода сценария). –

ответ

2

Когда вы выполняете скрипт, он выполняется в подоболочке, и его настройки среды теряются при выходе из оболочки. Если вы хотите настроить вашу интерактивную оболочку из сценария, вы должны source сценарий в вашей интерактивной оболочке.

$ source start-local.sh 

Теперь среда должна появиться в вашей интерактивной оболочке. Если вы хотите, чтобы эта натура была унаследована подоболочками, вы также должны указать export любые переменные, которые потребуются. Так, например, в path-to-file.env вам нужны строки, такие как:

export MY_IMPORTANT_PATH_VAR="/example/blah" 
+0

OP * * * sourcing файл. Я * предполагаю *, что они проверяют, установлены ли переменные с помощью поведения их 'pm2'-сервисов, вызываемых впоследствии; если они предполагают, что они будут доступны в их внешней оболочке, тогда да, это очевидный провал ожидания. –

+0

Я использую 'echo $ -' в оболочке для проверки, и они не устанавливаются. Это имеет смысл. Есть ли способ сделать то, что я хочу сделать, без поиска каждого файла по отдельности? – nickcorin

+1

Я вижу 'source' invocations * внутри * скрипта. Нет никаких признаков того, что сам сценарий был получен из интерактивной оболочки. –

Смежные вопросы