【问题标题】:customizing cd command自定义 cd 命令
【发布时间】:2012-04-05 10:22:23
【问题描述】:


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

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

【问题讨论】:

  • 为什么人们要关闭它?这是否与其他线程重复,我不这么认为。还是因为拥有 100K 或 900K 声望的人没有机会回答这个问题?

标签: bash shell ubuntu cd


【解决方案1】:

你想要“内置”命令;

内置 shell-builtin [参数]

执行指定的shell内置, 传递它的参数,并返回它的退出状态。这在以下情况下很有用 定义一个名称与内置 shell 相同的函数, 在函数中保留内置函数的功能。光盘 builtin 通常以这种方式重新定义。如果返回状态为假 shell-builtin 不是 shell 内置命令。

发件人:http://linux.die.net/man/1/bash

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

function cd() {
    builtin cd $1 \
        && test -e .bashrc \
        && source .bashrc
}

【讨论】:

  • 可能应该检查cd的成功:builtin cd "$1" && test -e .bashrc && source .bashrc
【解决方案2】:

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

【讨论】:

  • 我设计 direnv 时的一个具体目标是避免像 RVM 那样覆盖内置命令(是吗?)。相反,direnv 依赖于 shell 钩子,如 bash 中的 PROMPT_COMMAND 来检测目录更改。
【解决方案3】:

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 如果成功则运行一些代码,如果失败则返回退出代码。

【讨论】:

    【解决方案4】:

    你可以试试这个:

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

    不过,没有测试这么多。

    【讨论】:

    • 问题是一样的,递归调用这个新的 cd 定义。
    • 我已经在以下变体中对此进行了测试:function cdd(){ cd $1;如果 [ -e ./.bashrc ];然后回显“嗨,那里!”; fi } alias cd='cdd' 然后提示> cd Hi, there
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 2020-03-29
    • 2023-02-01
    • 2014-03-17
    • 2010-12-15
    • 2014-04-06
    • 1970-01-01
    相关资源
    最近更新 更多