#bash #source #auto #workspace #cd #shell #environment

app envrc

自动加载您工作区的 bash .envrc

4 个版本 (破坏性更新)

使用旧的 Rust 2015

0.5.0 2019年1月19日
0.4.0 2019年1月3日
0.3.0 2018年7月17日
0.2.0 2018年6月21日

#23 in #auto

MIT 协议

16KB
374

envrc - 自动加载您工作区的 bash .envrc

为什么?

首先,direnv 目前不支持别名。

其次,

direnv 实际上创建了一个新的 bash 进程来加载 stdlib、direnvrc 和 .envrc,并仅将环境差异导回原始 shell。

然而,envrc 更简单。它启动一个新的交互式 bash 并加载 .envrc。当您 cd 出目录时,shell 退出并将终端返回到原始 shell。

安装

  • cargo安装 envrc
  • .envrc 添加到 bashrc 的末尾

用法

$ mkdir foo
$ 
$ echo 'echo in foo directory' > foo/.envrc
$ 
$ cd foo
  envrc: spawning new /bin/bash
  envrc: loading [/home/roxma/test/envrc/foo/.envrc]
  in foo directory
$ 
$ cd ..
  envrc: exit [/home/roxma/test/envrc/foo/.envrc]
$ envrc
  envrc 0.2
  Rox Ma roxma@qq.com
  auto source .envrc of your workspace

  USAGE:
      envrc [SUBCOMMAND]

  FLAGS:
      -h, --help       Prints help information
      -V, --version    Prints version information

  SUBCOMMANDS:
      allow    Grant permission to envrc to load the .envrc
      bash     for bashrc: PROMPT_COMMAND='eval "$(envrc bash)"'
      deny     Remove the permission
      help     Prints this message or the help of the given subcommand(s)
      prune    Remove expired or non-existing-file permissions

注意:在退出 .envrc 之前,请注意您的后台任务。

.envrc 小贴士

  • export WORKSPACE_DIR=$(readlink -f "$(dirname "${BASH_SOURCE[0]}")") 用于 .envrc 以定位其目录。
  • exec bash 重新加载修改后的 .envrc

.bashrc 配置

# If the `.envrc` is allowed, but not sourced for 1d since last unload, It
# will be considered expired
export ENVRC_ALLOW_DURATION=$((60*60*24))
PROMPT_COMMAND='eval "$(envrc bash)"'

为什么不选择 bash/python?

第一个工作提交是用 python 编写的。但在我电脑上的 python 版本有明显的延迟。用 perl 重新编写也没有帮助。然后我决定切换到 rust。

$ time envrc.py bash-prompt-command >/dev/null
real    0m0.079s
user    0m0.044s
sys     0m0.004s

我还尝试了纯bash实现。它的性能比python实现更好,因为python的大部分开销在于启动时间。bash的大部分开销是子进程的fork/exec,它的速度远低于rust实现。更多信息请参阅#1

依赖项

约750KB