我有以下 bash 脚本。它实际上是一个环境变量文件,其中包含一些我想要根据我在获取它时传入的参数来设置的环境变量。这是 MWE。
#!/usr/bin/env bash
# CONSTANTS
PROD_STR='prod'
TEST_STR='test'
# Set the environment: 'prod' or 'test'
if [ "$1" == $PROD_STR ] || [ "$1" == $TEST_STR ]; then
export DEV_ENV=$1
echo "Found valid dev environment: "$DEV_ENV
else
echo "No valid environment specified"
echo "Usage: env_vars <env>"
echo ' env - one of "prod" or "test"'
fi
case $DEV_ENV in
$PROD_STR)
export MY_HOST='fooProd.net'
export PORT='8000';;
$TEST_STR)
export MY_HOST='fooTest.net'
export PORT='8100';;
esac
export API_USERNAME='foo'
export API_PASSWORD='mypwrd'
现在我想要
source
这个我命名为test_env_var.sh
的文件。我试过了。
source test_env_var.sh prod
它给了我以下内容test_env_var.sh:8: = not found
. ./test_env_var.sh prod
。
它仍然给我:./test_env_var:8: = not found
。./test_env_var prod
现在它运行时没有错误并且回显(正如它应该的那样)输出
Found valid dev environment: prod
。所以现在在执行(3)之后我希望看到我的环境变量设置。但当我这么做的时候
echo $API_USERNAME
它不会返回任何东西。
解决方法
我通过在提示符下输入
bash
暂时将 $SHELL 更改为 bash。然后我运行脚本
. test_env_var prod
现在,当我尝试
echo
我设置的任何env variable
时(例如echo $API_USERNAME
,它会返回我应该的foo
)。即使我通过输入 zsh
改回 zsh
,环境变量仍然存在。
问题: 为什么会出现这种情况?我是否无法在不将 $SHELL 更改为 bash 的情况下运行此 bash 脚本?也许 bash 脚本的语法需要更改,以便它在
zsh
上运行。但这不是一个选项,因为该文件受版本控制。
更多背景信息 我的
zsh
和 bash
都是 usr/local/bin/
,所以我认为 shebang #!/usr/bin/env bash
应该处理这个问题。
改变
if [ "$1" == $PROD_STR ] || [ "$1" == $TEST_STR ]; then
到
if [ "$1" = $PROD_STR ] || [ "$1" = $TEST_STR ]; then
==
是 bash
扩展。 =
是标准 POSIX 语法,bash
和 zsh
都支持。
解答您的困惑
即使我通过输入 zsh 改回 zsh,环境变量仍然存在。
您本质上是在彼此之间嵌套 shell 会话,因此如果您执行
exit
两次,您将返回到初始 shell。
例如:
zsh> bash
bash> zsh
zsh>
zsh> exit
bash> exit
zsh>