在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脚本中。
任何帮助,将不胜感激。
当您执行脚本时,它将在子shell中执行,并且在子shell退出时其环境设置将丢失。如果要从脚本配置交互式shell,则必须在交互式shell中使用source
脚本。
$ source start-local.sh
现在环境应该出现在交互式shell中。如果你希望这个环境被子壳体继承,你还必须使用任何将需要的变量。因此,例如,在path-to-file.env中,您需要如下行:
export MY_IMPORTANT_PATH_VAR="/example/blah"
OP *是*源文件。我*推测*他们正在检查变量是否通过之后调用的'pm2'服务的行为来设置;如果他们打算让它们在外壳中可用,那么是的,这是一个明显的期望失败。 –
我在shell中使用'echo $ -'来检查并且它们没有被设置。这确实是有道理的。有没有办法做到我想要做的事情,而不是单独采购每个文件? – nickcorin
我在*脚本中看到'source' invocations *。没有迹象表明脚本本身来自交互式shell。 –
该文件究竟是什么? echo $ -'如何在您的交互式shell和它所在的脚本之间进行比较? –
......最有可能的情况是你在'〜/ .bashrc'或类似文件中运行'set -a'。 –
(假设有合理的期望 - 即,您不希望脚本退出后变量交互式可用)。 –