Direnv – Manage Project-Specific Environment Variables in Linux

direnv is a nifty open-source extension for your shell on a UNIX operating system such as Linux and macOS. It is compiled into a single static executable and supports shells such as bash, zsh, tcsh, and fish.

The main purpose of direnv is to allow for project-specific environment variables without cluttering ~/.profile or related shell startup files. It implements a new way to load and unload environment variables depending on the current directory.

It is used to load 12factor apps (a methodology for building software-as-a-service apps) environment variables, create per-project isolated development environments, and also load secrets for deployment. Additionally, it can be used to build multi-version installation and management solutions similar to rbenv, pyenv, and phpenv.

So How Does direnv Works?

Before the shell loads a command prompt, direnv checks for the existence of a .envrc file in the current (which you can display using the pwd command) and parent directory. The checking process is swift and can’t be noticed on each prompt.

Once it finds the .envrc file with the appropriate permissions, it loads it into a bash sub-shell and it captures all exported variables and makes them available to the current shell.

Installing direnv in Linux Systems

In most of the Linux distributions, the direnv package is available to install from the default repositories using your system package manager as shown.

$ sudo apt install direnv		#Debian,Ubuntu and Mint
$ sudo dnf install direnv		#Fedora

On other distributions such as Red Hat Enterprise Linux (RHEL) and CentOS or any distribution that supports snaps, you can install it as a snap. This requires you to have snapd installed on your system.

$ sudo snap install direnv

How to Hook direnv into Your Bash Shell

After installing direnv, you need to hook it into your current Linux shell. For example for Bash, add the following line at the end of the ~/.bashrc file.

Make sure that it appears even after rvm, git-prompt, and other shell extensions that manipulate the prompt.

eval "$(direnv hook bash)"

For ZSH Shell

Append the following line at the end of the ~/.zshrc file:

eval "$(direnv hook zsh)" 

For FISH Shell

Append the following line at the end of the ~/.config/fish/config.fish file:

eval (direnv hook fish)

Then close the active terminal window and open a new shell or source the file as shown.

$ source ~/.bashrc
$ source  ~/.zshrc 
$ source ~/.config/fish/config.fish

How to Use direnv in Linux Shell

To demonstrate how direnv works, we will create a new directory called tecmint_projects and move into it.

$ mkdir ~/tecmint_projects
$ cd tecmint_projects/

Next, let’s create a new variable called TEST_VARIABLE on the command line and when it is echoed, the value should be empty:

$ echo $TEST_VARIABLE

Now we will create a new .envrc file that contains Bash code that will be loaded by direnv. We also try to add the line “export the TEST_VARIABLE=tecmint” in it using the echo command and the output redirection character (>):

$ echo export TEST_VARIABLE=tecmint > .envrc

By default, the security mechanism blocks the loading of the .envrc file. Since we know it a secure file, we need to approve its content by running the following command:

$ direnv allow .

Now that the content of .envrc file has been allowed to load, let’s check the value of TEST_VARIABLE that we set before:

$ echo $TEST_VARIABLE

When we exit the tecmint_project directory, the direnv will be unloaded and if we check the value of TEST_VARIABLE once more, it should be empty:

$ cd ..
$ echo $TEST_VARIABLE
Demonstration of How direnv Works in Linux
Demonstration of How direnv Works in Linux

Every time you move into the tecmint_projects directory, the .envrc file will be loaded as shown in the following screenshot:

$ cd tecmint_projects/
Loading envrc File in a Directory
Loading envrc File in a Directory

To revoke the authorization of a given .envrc, use the deny command.

$ direnv deny .			#in current directory
OR
$ direnv deny /path/to/.envrc

For more information and usage instructions, see the direnv man page:

$ man direnv

Additionally, direnv also uses a stdlib (direnv-stdlib) comes with several functions that allow you to easily add new directories to your PATH and do so much more.

To find the documentation for all available functions, check the direnv-stdlib manual entry page:

$ man direnv-stdlib

That’s all we had for you! If you have any questions or thoughts to share with us, use the feedback form below.

Aaron Kili
Aaron Kili is a Linux and F.O.S.S enthusiast, an upcoming Linux SysAdmin, web developer, and currently a content creator for TecMint who loves working with computers and strongly believes in sharing knowledge.

Each tutorial at TecMint is created by a team of experienced Linux system administrators so that it meets our high-quality standards.

Join the TecMint Weekly Newsletter (More Than 156,129 Linux Enthusiasts Have Subscribed)
Was this article helpful? Please add a comment or buy me a coffee to show your appreciation.

Got something to say? Join the discussion.

Thank you for taking the time to share your thoughts with us. We appreciate your decision to leave a comment and value your contribution to the discussion. It's important to note that we moderate all comments in accordance with our comment policy to ensure a respectful and constructive conversation.

Rest assured that your email address will remain private and will not be published or shared with anyone. We prioritize the privacy and security of our users.