在 zsh 上运行 bash 脚本不会获取环境变量

问题描述 投票:0回答:2

我有以下 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
的文件。我试过了。

  1. source test_env_var.sh prod
    它给了我以下内容
    test_env_var.sh:8: = not found
  2. . ./test_env_var.sh prod
    。 它仍然给我:
    ./test_env_var:8: = not found

  3. ./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
应该处理这个问题。

bash shell environment-variables zsh
2个回答
3
投票

改变

if [ "$1" == $PROD_STR ] || [ "$1" == $TEST_STR ]; then

if [ "$1" = $PROD_STR ] || [ "$1" = $TEST_STR ]; then

==
bash
扩展。
=
是标准 POSIX 语法,
bash
zsh
都支持。


0
投票

解答您的困惑

即使我通过输入 zsh 改回 zsh,环境变量仍然存在。

您本质上是在彼此之间嵌套 shell 会话,因此如果您执行

exit
两次,您将返回到初始 shell。

例如:

zsh> bash
bash> zsh
zsh>

zsh> exit
bash> exit
zsh>
© www.soinside.com 2019 - 2024. All rights reserved.