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

Asbefore如初_3142 · · 509 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

个人网站地址

为什么要有这样的功能?

设想有下列的使用场景

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 ~ 即可观看效果


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:Asbefore如初_3142

查看原文:Linux cd 自动加载目录的环境变量

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

509 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传