Skip to main content
Version: 0.6.0

Variables

Each task is executed in a sandboxed environment. This means environment variables from your system are not forwarded to the internal shell. Let's have a look at the options you have to alter that behaviour.

Variables via Bobfile

You can define variables in your Bobfile using the variables node:

variables:
VAR_ONE: hello
build:
build:
cmd: echo $VAR_ONE
rebuild: always

When running bob build VAR_ONE is made available to the task, see the hello output:

$  bob build
Running task build with 0 dependencies

build running task...
build hello
build ...done

Variables via CLI

You can also set and forward variables via CLI using the --env flag.

Having a bob.yaml with following contents:

build:
hello:
cmd: echo $VAR_ONE $VAR_TWO
rebuild: always

you can run bob build hello --env VAR_ONE=Hello --env VAR_TWO=World! to set the values of VAR_ONE and VAR_TWO:

$ bob build hello --env VAR_ONE=Hello --env VAR_TWO=World!

Running task hello with 0 dependencies

hello running task...
hello Hello World!
hello ...done

The priority of environment variables is CLI > Bobfile which means that passing a variable via CLI will overwrite other variable with the same name in your Bobfile.

The --env flag is available on both bob build and bob run commands.

To forward variables from your environment just do bob build --env NAME_OF_VAR (without =value).

Examples

Sandboxed Shell

To test this, let's create an env task which print the environment variables using the printenv command:

build:
env:
cmd: printenv
rebuild: always

Run bob build env to get:

$ bob build env
Building nix dependencies...
Succeeded building nix dependencies
Running task env with 0 dependencies

env running task...
env HOME=/home/andrei
env PATH=/nix/store/j9rc786ylq8cid4zgcn6idknilkbd4ax-bash-5.1-p16/bin:/nix/store/l2xyarvzahpz3fysr9hqbvcsgv5gnrnk-coreutils-9.1/bin:/nix/store/l62i4fn54qry9xamnj209wfizpw2bng5-gnused-4.8/bin:/nix/store/ip1zdc23sqyq15957lbjrxj31m5xh72c-findutils-4.9.0/bin
env ...done

The whole environment was cleared except HOME and PATH.

HOME and XDG_CACHE_HOME are whitelisted for convenience because many programs use them.

PATH was added because of default packages which were installed by nix. By default, Nix will install bash , coreutils gnused and findutils packages.

Forwarding variables

You can forward variables from the local environment with the same --env flag.

For example, if we want to use the LANG variable from our system, we can just use --env LANG.

Let's try to create a new variables and also keep one from the local system:

bob build env --env NEW_VAR="Hello" --env LANG

$ bob build env --env NEW_VAR="Hello" --env LANG
Building nix dependencies...
Succeeded building nix dependencies
Running task env with 0 dependencies

env running task...
env HOME=/home/andrei
env LANG=en_US.UTF-8
env NEW_VAR=Hello
env PATH=/nix/store/j9rc786ylq8cid4zgcn6idknilkbd4ax-bash-5.1-p16/bin:/nix/store/l2xyarvzahpz3fysr9hqbvcsgv5gnrnk-coreutils-9.1/bin:/nix/store/l62i4fn54qry9xamnj209wfizpw2bng5-gnused-4.8/bin:/nix/store/ip1zdc23sqyq15957lbjrxj31m5xh72c-findutils-4.9.0/bin
env ...done

As you can see, the LANG variable was added from the local system and also NEW_VAR was created.