通常我会在.bashrc
中保留特定于目录的设置,每当我更改目录时,执行命令source .bashrc
以使这些设置生效。
现在我正在考虑在~/.bashrc
中操作cd命令,所以每当我cd到新目录并且那里存在任何.bashrc时,它将自动加载。
与此cd $1; source .bashrc
类似(我已经验证$ 1是有效路径),但问题是cd是shell构建,所以它是一个递归循环(cd总是指向修改的cd)。我们没有cd的elf文件(通常我们有其他命令即scp或其他命令)。那我该怎么做呢?
此外,如果支持shopt -s cdspell
,那么我还需要在$ 1的参数中使用cd拼写路径。
答案 0 :(得分:6)
你想要“内置”命令;
内置shell-builtin [参数]
执行指定的shell内置, 传递参数,并返回其退出状态。这很有用 定义一个名称与shell内置相同的函数, 在函数中保留内置函数。 cd 内置通常以这种方式重新定义。如果返回状态为false shell-builtin不是shell内置命令。
来自:http://linux.die.net/man/1/bash
所以,你可能会有类似的东西(未经测试,也没有bash方便);
function cd() {
builtin cd $1 \
&& test -e .bashrc \
&& source .bashrc
}
答案 1 :(得分:2)
你可以查看direnv。 https://github.com/zimbatm/direnv
答案 2 :(得分:1)
RVM这样做:
$ type cd
cd is a function
cd ()
{
if builtin cd "$@"; then
[[ -n "${rvm_current_rvmrc:-}" && "$*" == "." ]] && rvm_current_rvmrc="" || true;
__rvm_do_with_env_before;
__rvm_project_rvmrc;
__rvm_after_cd;
__rvm_do_with_env_after;
return 0;
else
return $?;
fi
}
是的,这适用于我的机器。基本上,正如@RoryHunter所说,使用builtin
并在成功时运行一些代码,如果失败则返回退出代码。
答案 3 :(得分:0)
你可以试试这个:
function cdd(){ cd $1; if [ -e ./.bashrc ] ; then source ./.bashrc; fi; }
alias cd = 'cdd'
?
然而,没有测试过这么多。