Bash 在zsh-won';t来源于环境变量

Bash 在zsh-won';t来源于环境变量,bash,shell,environment-variables,zsh,Bash,Shell,Environment Variables,Zsh,我有下面的bash脚本。它实际上是一个env变量文件,其中包含一些环境变量,我想根据我在获取源代码时传入的参数进行设置。这是一个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=$

我有下面的bash脚本。它实际上是一个env变量文件,其中包含一些环境变量,我想根据我在获取源代码时传入的参数进行设置。这是一个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'
它不会返回任何东西

解决方法

我通过在提示符下键入
bash
将$SHELL临时更改为bash。然后我运行脚本作为

. test_env_var prod
现在,当我尝试
echo
任何
env变量
时,我已经设置好了(例如
echo$API\u 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

=
是一个
bash
扩展
=
是标准的POSIX语法,它由
bash
zsh

替换
[“$1”==$PROD_STR]| |[“$1”==$TEST_STR]
[“$1”=$PROD_STR]].[“$1”=$TEST|STR]]。这在bash和zsh中都适用。但是,要意识到,在zsh中寻找bash脚本将像在zsh中一样执行该脚本中的每一行。shebang仅在执行脚本而不是源代码时才有效。寻源脚本就像是在终端或父脚本中复制粘贴的脚本(使用更新的参数
$1
$2
,…)
if [ "$1" == $PROD_STR ] || [ "$1" == $TEST_STR ]; then
if [ "$1" = $PROD_STR ] || [ "$1" = $TEST_STR ]; then