# Circleci - cannot read env variables defined inside script

**URL:** <https://discuss.circleci.com/t/circleci-cannot-read-env-variables-defined-inside-script/13131>\
**Category:** Build Environment\
**Created:** [June 6, 2017, 10:36am UTC](https://discuss.circleci.com/t/circleci-cannot-read-env-variables-defined-inside-script/13131 "2017-06-06T10:36:13Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![sj82516](https://avatars.discourse-cdn.com/v4/letter/s/f14d63/32.png) [@sj82516](https://discuss.circleci.com/u/sj82516)\
**Post date:** [June 6, 2017, 10:36am UTC](https://discuss.circleci.com/t/circleci-cannot-read-env-variables-defined-inside-script/13131/1 "2017-06-06T10:36:14Z")

</div>

I write a script for setting env variables.

```
export DB_HOST='127.0.0.1'
export DB_USER='ubuntu'
export DB_PWD=''
export DB_NAME='circle_test'

```

My circle.yml look like this

```
machine:
  timezone: Asia/Taipei
  services:
    - mysql

dependencies:
  pre:
    - sudo apt-get update
    - nvm install 7.9 && npm install

test:
  pre:
    - source ./config/test_config.sh
    - sh ./config/test_config.sh
    - pwd
    - printenv
  override:
    - nvm use 7.9 && npm test

```

My nodejs application cannot read the env variables and I didn’t saw in the printenv also.

I don’t want to write env variables directly into circle.yml file because I would like to have `prod_config.sh`、`dev_config.sh` to dynamically change.

How can I do that ?

---

<div class="post-metadata">

**Author:** ![FelicianoTech](https://sea2.discourse-cdn.com/circleci/user_avatar/discuss.circleci.com/felicianotech/32/21348_2.png) [@FelicianoTech](https://discuss.circleci.com/u/FelicianoTech)\
**Post date:** [June 6, 2017, 4:24pm UTC](https://discuss.circleci.com/t/circleci-cannot-read-env-variables-defined-inside-script/13131/2 "2017-06-06T16:24:55Z")

</div>

Hi,

Every separate command (lines prefixed with `-`) is run in its own shell. This is why your environment variables, which you source, don’t exists in the following commands. There’s three ways I see going about this:

1. Define your environment variables in `circle.yml`. I know you said you don’t want to do this, but this is the by far the easiest and most clear method.

2. You can prefix the lines that need the variables with the source command. For example:

```auto
test:
  override:
    - source ./config/test_config.sh; nvm use 7.9 && npm test

```

1. Take advantage of multiline YAML:

```auto
test:
  override:
    - >
      source ./config/test_config.sh
      nvm use 7.9 && npm test

```

1. Or place all of the commands in its on Bash file and just run that script:

```auto
test:
  override:
    - ./all-commands-script.sh

```

---

<div class="post-metadata">

**Author:** ![sj82516](https://avatars.discourse-cdn.com/v4/letter/s/f14d63/32.png) [@sj82516](https://discuss.circleci.com/u/sj82516)\
**Post date:** [June 6, 2017, 8:27pm UTC](https://discuss.circleci.com/t/circleci-cannot-read-env-variables-defined-inside-script/13131/3 "2017-06-06T20:27:42Z")

</div>

Thanks a lot ! You save my day.

---

<div class="post-metadata">

**Author:** ![system](https://global.discourse-cdn.com/circleci/original/3X/5/1/511608acda8e85906e15909b57bd0a46c1dbe291.png) [@system](https://discuss.circleci.com/u/system)\
**Post date:** [June 18, 2018, 11:39am UTC](https://discuss.circleci.com/t/circleci-cannot-read-env-variables-defined-inside-script/13131/4 "2018-06-18T11:39:33Z")

</div>


