Linux cd 自动加载目录的环境变量

Linux cd 自动加载目录的环境变量

为什么要有这样的功能?

设想有下列的使用场景

1: 有一个 python 项目,使用 virtualenv 创建了一个虚拟环境

在运行前,需要执行 source venv/bin/activate

然后才能执行 python run.py

在执行完成后,为了不影响后续的 python 使用,还需要退出虚拟环境,执行:deactivate

2: 有多个 golang 项目,依赖的库和版本不一样

在 目录1 时,需要手动 export 设定 GOPATH

当编写工程2 时,同样需要手动 export 再设定一遍 GOPATH

编写脚本

脚本自动检测文件是否存在,并加载环境变量

cdrun(){
  # 进入目录时,执行此目录的环境配置
  # 退出目录时,同样执行此目录的环境配置
  if [ `pwd` != "$HOME/software" -a -f ".runrc" \
      -a -r ".runrc" ]; then
      export RUNRC_STATUS="out"
      source .runrc
  fi
  if [ -f ~/software/.runrc ]; then . ~/software/.runrc; fi
  \cd $@
  if [ `pwd` != "$HOME/software" -a -f ".runrc" \
      -a -r ".runrc" ]; then
      export RUNRC_STATUS="run"
      source .runrc
  fi
  unset RUNRC_STATUS
}

alias别名设定cd

编写之后使用 alias 别名设定 cd 命令,使其在执行时加载目录环境

alias cd='cdrun $@'

在哪里设定?当然是 用户目录的 .bashrc

修改后的 .bashrc 类似下列:

...
xxxxxxxxxxxxxxxxxxxxx
...
# 上面假设是已有的环境,不要改动
# 下面新增以下内容:

cdrun(){
  # 进入目录时,执行此目录的环境配置
  # 退出目录时,同样执行此目录的环境配置
  if [ `pwd` != "$HOME/software" -a -f ".runrc" \
      -a -r ".runrc" ]; then
      export RUNRC_STATUS="out"
      source .runrc
  fi
  if [ -f ~/software/.runrc ]; then . ~/software/.runrc; fi
  \cd $@
  if [ `pwd` != "$HOME/software" -a -f ".runrc" \
      -a -r ".runrc" ]; then
      export RUNRC_STATUS="run"
      source .runrc
  fi
  unset RUNRC_STATUS
}
alias cd='cdrun $@'

说明

在进入和退出目录时,会检测当前目录是否存在某个文件,然后通过一个变量标志是退出还是进入

当然,有一个环境变量 ~/software/.runrc 文件,在每次退出目录时加载

这是为了充当一个全局的环境变量,类似于 /etc/bash.bashrc 一样
在执行 cd 命令前,除了加载当前目录的环境,还会加载一次全局环境变量

一般可以不用关注

使用

自动加载python虚拟环境

假设 python 工程目录在 /home/admin/pyproject
有一个 virtualenv 环境: venv
则在此目录下,创建 .runrc 文件,注意有一个 点 : .

cd /home/admin/pyproject
vim .runrc

文件内容如下:

if [ "$RUNRC_STATUS"x == "run"x ]; then
    echo "auto load python"
    source ./venv/bin/activate
else
    deactivate
fi

在进入目录时自动加载 virtualenv 环境,退出目录则 卸载环境

在此目录下执行: cd ./ 即会发现环境自动加载了

自动设定 GOPATH

假设 go 工程目录在 /home/admin/goproject
则执行:

cd /home/admin/goproject
vim .runrc

文件内容可以设定如下:

if [ "$RUNRC_STATUS"x == "run"x ]; then
    # 进入到当前目录
    # 执行一些初始化操作
    GO_PATH_TMP=$GOPATH
    export GOPATH=`pwd`
    echo "set GOPATH=$GOPATH"
else
    export GOPATH=$GO_PATH_TMP
    unset GO_PATH_TMP
    echo "reset GOPATH=$GOPATH"
fi

进入目录会设定当前 GOPATH 环境变量,并临时保存之前的 GOPATH
退出目录则会重设 GOPATH 为之前的变量

cd 到HOME目录输出欢迎信息

用户执行 cd 或者 cd ~ 进入 home 目录时,输出一行欢迎信息
执行 vim ~/.runrc 文件内容如下:

if [ "$RUNRC_STATUS"x == "run"x ]; then
    # 输出欢迎信息
    echo "hello"
else
    # 退出当前目录,执行一些退出操作
    echo >/dev/null
fi

执行 cd ~ 即可观看效果

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://zwc365.com/2020/07/22/autoloadbash

Buy me a cup of coffee ☕.