在shell脚本中设置环境变量OS X

在shell脚本中设置环境变量OS X

问题描述:

我正在尝试创建一个Shell脚本来自动执行我的本地开发环境。我需要它启动一些进程(Redis,MongoDB等),设置环境变量,然后启动本地Web服务器。我正在开发OS X El Capitan。在shell脚本中设置环境变量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,那么它可以工作。我想知道为什么命令可以独立工作,但不在shell脚本中。

任何帮助,将不胜感激。

+0

该文件究竟是什么? echo $ -'如何在您的交互式shell和它所在的脚本之间进行比较? –

+0

......最有可能的情况是你在'〜/ .bashrc'或类似文件中运行'set -a'。 –

+0

(假设有合理的期望 - 即,您不希望脚本退出后变量交互式可用)。 –

当您执行脚本时,它将在子shell中执行,并且在子shell退出时其环境设置将丢失。如果要从脚本配置交互式shell,则必须在交互式shell中使用source脚本。

$ source start-local.sh 

现在环境应该出现在交互式shell中。如果你希望这个环境被子壳体继承,你还必须使用任何将需要的变量。因此,例如,在path-to-file.env中,您需要如下行:

export MY_IMPORTANT_PATH_VAR="/example/blah" 
+0

OP *是*源文件。我*推测*他们正在检查变量是否通过之后调用的'pm2'服务的行为来设置;如果他们打算让它们在外壳中可用,那么是的,这是一个明显的期望失败。 –

+0

我在shell中使用'echo $ -'来检查并且它们没有被设置。这确实是有道理的。有没有办法做到我想要做的事情,而不是单独采购每个文件? – nickcorin

+1

我在*脚本中看到'source' invocations *。没有迹象表明脚本本身来自交互式shell。 –