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

时间:2018-11-07 17:16:19

标签: bash shell environment-variables zsh

我有以下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)之后,我希望看到我的env变量已设置。但是当我这样做

echo $API_USERNAME

它不返回任何内容。

解决方法

我在提示符下键入bash暂时将$ SHELL更改为bash。然后我以

运行脚本
. test_env_var prod

现在,当我尝试echo设置的任何env variable时(例如echo $API_USERNAME,它会按原样返回foo)。即使我通过输入zsh回到zsh,环境变量仍然存在。

问题: 为什么会这样?如果不将$ SHELL更改为bash,我是否无法运行此bash脚本? bash脚本的语法可能需要更改,以便它可以在zsh上运行。但这不是一个选择,因为此文件受版本控制。

更多上下文 我想我的zshbash都是usr/local/bin/,所以shebang #!/usr/bin/env bash应该照顾好这个问题。

1 个答案:

答案 0 :(得分:1)

更改

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

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

==bash的扩展名。 =是标准的POSIX语法,bashzsh都支持。