自定义cd命令

时间:2012-04-05 10:22:24

标签: bash shell ubuntu cd


通常我会在.bashrc中保留特定于目录的设置,每当我更改目录时,执行命令source .bashrc以使这些设置生效。
 现在我正在考虑在~/.bashrc中操作cd命令,所以每当我cd到新目录并且那里存在任何.bashrc时,它将自动加载。

与此cd $1; source .bashrc类似(我已经验证$ 1是有效路径),但问题是cd是shell构建,所以它是一个递归循环(cd总是指向修改的cd)。我们没有cd的elf文件(通常我们有其他命令即scp或其他命令)。那我该怎么做呢?  此外,如果支持shopt -s cdspell,那么我还需要在$ 1的参数中使用cd拼写路径。

4 个答案:

答案 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' 
?

然而,没有测试过这么多。