Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages


home | help
DIRENV(1)			 User Manuals			     DIRENV(1)

       direnv -	unclutter your .profile

       direnv command ...

       direnv  is an environment variable manager for your shell. It knows how
       to hook into bash, zsh and fish shell to	 load  or  unload  environment
       variables  depending on your current directory. This allows you to have
       project-specific	environment variables and not clutter the " /.profile"

       Before each prompt it checks for	the existence of an .envrc file	in the
       current and parent directories. If the file exists, it is loaded	into a
       bash  sub-shell	and all	exported variables are then captured by	direnv
       and then	made available to your current shell,  while  unset  variables
       are removed.

       Because	direnv	is compiled into a single static executable it is fast
       enough to be unnoticeable on each prompt. It is also language  agnostic
       and can be used to build	solutions similar to rbenv, pyenv, phpenv, ...

	      $	cd  /my_project
	      $	echo ${FOO-nope}
	      $	echo export FOO=foo > .envrc
	      \.envrc is not allowed
	      $	direnv allow .
	      direnv: reloading
	      direnv: loading .envrc
	      direnv export: +FOO
	      $	echo ${FOO-nope}
	      $	cd ..
	      direnv: unloading
	      direnv export:  PATH
	      $	echo ${FOO-nope}

       For  direnv to work properly it needs to	be hooked into the shell. Each
       shell has it's own extension mechanism:

       Add the following line at the end of the	 /.bashrc file:

	      eval "$(direnv hook bash)"

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

       Add the following line at the end of the	 /.zshrc file:

	      eval "$(direnv hook zsh)"

       Add  the	 following  line  at the end of	the  /.config/fish/

	      direnv hook fish | source

       Fish supports 3 modes you can set  with	with  the  global  environment
       variable	direnv_fish_mode:

	      set -g direnv_fish_mode eval_on_arrow    # trigger direnv	at prompt, and on every	arrow-based directory change (default)
	      set -g direnv_fish_mode eval_after_arrow # trigger direnv	at prompt, and only after arrow-based directory	changes	before executing command
	      set -g direnv_fish_mode disable_arrow    # trigger direnv	at prompt only,	this is	similar	functionality to the original behavior

       Add the following line at the end of the	 /.cshrc file:

	      eval `direnv hook	tcsh`


	      $> direnv	hook elvish >  /.elvish/lib/direnv.elv

       and add the following line to your  /.elvish/rc.elv file:

	      use direnv

       In some target folder, create an	.envrc file and	add some export(1) and
       unset(1)	directives in it.

       On the next prompt you will notice that direnv complains	about the .en-
       vrc  being blocked. This	is the security	mechanism to avoid loading new
       files automatically. Otherwise any git repo that	you pull, or  tar  ar-
       chive  that  you	unpack,	would be able to wipe your hard	drive once you
       cd into it.

       So here we are pretty sure that it won't	do anything bad.  Type	direnv
       allow  .	  and watch direnv loading your	new environment. Note that di-
       renv edit . is a	handy shortcut that opens the file in your $EDITOR and
       automatically reloads it	if the file's modification time	has changed.

       Now  that the environment is loaded you can notice that once you	cd out
       of the directory	it automatically gets unloaded.	If you cd back into it
       it's  loaded again. That's the base of the mechanism that allows	you to
       build cool things.

       Exporting variables by hand is a	bit repetitive so  direnv  provides  a
       set  of utility functions that are made available in the	context	of the
       .envrc file.  Check the direnv-stdlib(1)	man page for more details. You
       can also	define your own	extensions inside  /.config/direnv/direnvrc or
       /.config/direnv/lib/*.sh	files.

       Hopefully this is enough	to get you started.

       Bug reports, contributions and forks are	welcome.

       All bugs	or other forms of discussion happen on


       There is	also a wiki available where you	can share your usage  patterns
       or other	tips and tricks	<>

       Or  drop	by on the #direnv channel on FreeNode <irc://#direnv@FreeNode>
       to have a chat.

       MIT licence - Copyright (C) 2019	@zimbatm and contributors

       direnv-stdlib(1), direnv.toml(1), direnv-fetchurl(1)

direnv				     2019			     DIRENV(1)


Want to link to this manual page? Use this URL:

home | help