У меня есть следующий скрипт 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
. Я пытался.
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) я ожидал увидеть набор переменных 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
.