网站搜索

Direnv - 在 Linux 中管理项目特定的环境变量


direnv 是一个漂亮的开源扩展,适用于 UNIX 操作系统(例如 Linux 和 macOS)上的 shell。它被编译为单个静态可执行文件,并支持 shell,例如 bashzshtcsh 和 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 文件末尾添加以下行。

确保它甚至出现在 rvmgit-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

这就是我们为您准备的一切!如果您有任何问题或想法要与我们分享,请使用下面的反馈表。