5


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

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

4

4 回答 4

6

你想要“内置”命令;

内置 shell-builtin [参数]

执行指定的内置 shell,传递参数,并返回其退出状态。这在定义名称与 shell 内置函数相同的函数时很有用,在函数中保留内置函数的功能。cd 内置通常以这种方式重新定义。如果 shell-builtin 不是 shell 内置命令,则返回状态为 false。

来自: http: //linux.die.net/man/1/bash

所以,你可以有类似的东西(未经测试,也没有 bash 方便);

function cd() {
    builtin cd $1 \
        && test -e .bashrc \
        && source .bashrc
}
于 2012-04-05T10:32:00.717 回答
2

您可以查看 direnv。https://github.com/zimbatm/direnv

于 2012-04-05T15:46:48.767 回答
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如果成功则使用并运行一些代码,如果失败则返回退出代码。

于 2012-04-05T11:03:58.800 回答
0

你可以试试这个:

function cdd(){ cd $1; if [ -e ./.bashrc ] ; then source ./.bashrc; fi; }
alias cd = 'cdd' 
?

然而,没有测试这么多。

于 2012-04-05T10:31:07.087 回答