为什么要有这样的功能?
设想有下列的使用场景
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 ~
即可观看效果