Set environment variables from file of key/value pairs Set environment variables from file of key/value pairs bash bash

Set environment variables from file of key/value pairs


This might be helpful:

export $(cat .env | xargs) && rails c

Reason why I use this is if I want to test .env stuff in my rails console.

gabrielf came up with a good way to keep the variables local. This solves the potential problem when going from project to project.

env $(cat .env | xargs) rails

I've tested this with bash 3.2.51(1)-release


Update:

To ignore lines that start with #, use this (thanks to Pete's comment):

export $(grep -v '^#' .env | xargs)

And if you want to unset all of the variables defined in the file, use this:

unset $(grep -v '^#' .env | sed -E 's/(.*)=.*/\1/' | xargs)

Update:

To also handle values with spaces, use:

export $(grep -v '^#' .env | xargs -d '\n')

on GNU systems -- or:

export $(grep -v '^#' .env | xargs -0)

on BSD systems.


From this answer you can auto-detect the OS with this:

export-env.sh

#!/bin/sh## Usage:##   . ./export-env.sh ; $COMMAND##   . ./export-env.sh ; echo ${MINIENTREGA_FECHALIMITE}unamestr=$(uname)if [ "$unamestr" = 'Linux' ]; then  export $(grep -v '^#' .env | xargs -d '\n')elif [ "$unamestr" = 'FreeBSD' ]; then  export $(grep -v '^#' .env | xargs -0)fi


-o allexport enables all following variable definitions to be exported. +o allexport disables this feature.

set -o allexportsource conf-fileset +o allexport


Problem with your approach is the export in the while loop is happening in a sub shell, and those variable will not be available in current shell (parent shell of while loop).

Add export command in the file itself:

export MINIENTREGA_FECHALIMITE="2011-03-31"export MINIENTREGA_FICHEROS="informe.txt programa.c"export MINIENTREGA_DESTINO="./destino/entrega-prac1"

Then you need to source in the file in current shell using:

. ./conf/prac1

OR

source ./conf/prac1