Direnv - 在 Linux 中管理项目特定的环境变量
direnv 是一个漂亮的开源扩展,适用于 UNIX 操作系统(例如 Linux 和 macOS)上的 shell。它被编译为单个静态可执行文件,并支持 shell,例如 bash、zsh、tcsh 和 Fish。
direnv 的主要目的是允许使用特定于项目的环境变量,而不会使 ~/.profile
或相关的 shell 启动文件变得混乱。它实现了一种根据当前目录加载和卸载环境变量的新方法。
它用于加载12factor应用程序(一种构建软件即服务应用程序的方法)环境变量,创建每个项目独立的开发环境,以及加载部署密钥。此外,它还可用于构建类似于 rbenv、pyenv 和 phpenv 的多版本安装和管理解决方案。
那么 direnv 是如何工作的呢?
在 shell 加载命令提示符之前,direnv 检查当前目录(可以使用 pwd 命令显示)和父目录中是否存在 .envrc
文件。检查过程很快,每次提示都无法被注意到。
一旦找到具有适当权限的 .envrc 文件,它就会将其加载到 bash 子 shell 中,并捕获所有导出的变量并使它们可用于当前 shell。
在 Linux 系统中安装 direnv
在大多数 Linux 发行版中,可以使用系统包管理器从默认存储库安装 direnv 包,如图所示。
sudo apt install direnv #Debian,Ubuntu and Mint
sudo dnf install direnv #Fedora
在其他发行版上,例如 Red Hat Enterprise Linux (RHEL) 和 CentOS 或任何支持快照的发行版,您可以将其安装为 >快照。这需要您在系统上安装 snapd。
sudo snap install direnv
如何将 direnv 挂接到您的 Bash Shell 中
安装 direnv 后,您需要将其挂接到当前的 Linux shell 中。例如,对于 Bash,请在 ~/.bashrc
文件末尾添加以下行。
确保它甚至出现在 rvm、git-prompt 和其他操作提示的 shell 扩展之后。
eval "$(direnv hook bash)"
对于 ZSH 外壳
在 ~/.zshrc
文件末尾添加以下行:
eval "$(direnv hook zsh)"
对于鱼壳
在 ~/.config/fish/config.fish
文件末尾添加以下行:
eval (direnv hook fish)
然后关闭活动终端窗口并打开一个新 shell 或获取文件,如图所示。
source ~/.bashrc
source ~/.zshrc
source ~/.config/fish/config.fish
如何在 Linux Shell 中使用 direnv
为了演示 direnv 的工作原理,我们将创建一个名为 howtoing_projects
的新目录并移入其中。
mkdir ~/tecmint_projects
cd tecmint_projects/
接下来,让我们在命令行上创建一个名为 TEST_VARIABLE
的新变量,当它被回显时,该值应该为空:
echo $TEST_VARIABLE
现在我们将创建一个新的 .envrc
文件,其中包含将由 direnv 加载的 Bash 代码。我们还尝试使用 echo 命令和输出重定向字符 (>)
在其中添加行“export the TEST_VARIABLE=howtoing”:
echo export TEST_VARIABLE=tecmint > .envrc
默认情况下,安全机制会阻止 .envrc
文件的加载。由于我们知道它是一个安全文件,因此我们需要通过运行以下命令来批准其内容:
direnv allow .
现在 .envrc
文件的内容已被允许加载,让我们检查一下之前设置的 TEST_VARIABLE
的值:
echo $TEST_VARIABLE
当我们退出 howtoing_project
目录时,direnv 将被卸载,如果我们再次检查 TEST_VARIABLE
的值,它应该为空:
cd ..
echo $TEST_VARIABLE
每次您进入 howtoing_projects 目录时,.envrc
文件都会被加载,如以下屏幕截图所示:
cd tecmint_projects/
要撤销给定 .envrc
的授权,请使用 deny 命令。
direnv deny . #in current directory
OR
direnv deny /path/to/.envrc
有关更多信息和使用说明,请参阅 direnv 手册页:
man direnv
此外,direnv 还使用 stdlib (direnv-stdlib) 附带的多个函数,可让您轻松地将新目录添加到 PATH 并做更多事情。
要查找所有可用函数的文档,请检查 direnv-stdlib 手动输入页面:
man direnv-stdlib
这就是我们为您准备的一切!如果您有任何问题或想法要与我们分享,请使用下面的反馈表。