запуск сценария bash на zsh не приведет к появлению переменных среды - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть следующий скрипт 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'

Теперь я хотел 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

Он ничего не возвращает.

Обход

Я временно изменяю свой $ SHELL на bash, набирая bash в командной строке. Затем я запускаю скрипт как

. test_env_var prod

и теперь, когда я пытаюсь echo любой env variable, который я установил (например, echo $API_USERNAME он возвращает мне foo, как и должно). Даже если я вернусь к zsh, набрав zsh, переменные среды все еще там.

Вопрос: Почему это происходит?. Разве я не могу запустить этот скрипт bash, не меняя $ SHELL на bash ?. Возможно, синтаксис bash-скрипта нужно изменить так, чтобы он работал на zsh. Но это не вариант, так как этот файл находится под контролем версий.

Еще немного контекста И мои zsh и bash равны usr/local/bin/, поэтому я думаю, что об этом должен позаботиться шебанг #!/usr/bin/env bash.

1 Ответ

0 голосов
/ 07 ноября 2018

Изменение

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

до

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

== является расширением bash. = - это стандартный синтаксис POSIX, который поддерживается как bash, так и zsh.

...