更改cd默认目录(bash)

Jay*_*Jay 6 linux bash terminal cd

我正在寻找一种方法来改变cd的默认目录,我想知道这是否可行.我尝试添加

alias "cd=cd ~/Documents/Github" 

到.bashrc,但这显然不起作用,因为它打破了cd命令,因此除了转到该目录之外,你不能使用cd.是否有一些导出我可以放入.bashrc来执行此操作?我不想更改我的主目录,只是默认目录cd转到.我问,因为我经常使用cd切换到我编程在我的默认目录,想不必键入cd ~/workspacecd然后cd workspace我不想每次都更改为目录~/workspace.

mkl*_*nt0 12

这是使用别名的更简单的替代方法:

alias cd='HOME=~/Documents/Github cd'
Run Code Online (Sandbox Code Playgroud)
  • 虽然这个重新定义$HOME,它只对cd命令这样做,所以应该是安全的(*).
  • 这也消除了对任何自定义参数预解析的需要.

如果你放入它~/.bashrc,你应该得到所需的行为.

请注意,默认情况下,此别名在脚本(非交互式shell)中不起作用,因为默认情况下禁用别名扩展(用于shopt -s expand_aliases显式启用).


(*)@chepner指出一个限制:在地方的别名,你将不能够这样做HOME=/somewhere/else cd,也就是说,你将无法重新定义(覆盖)$HOME 再次,特设.然而,正如他进一步指出的那样,很难想象为什么有人会想这样做.


che*_*ner 5

cd您可以使用 shell 函数隐藏内置命令。将以下内容添加到您的.bashrc文件中。

cd () {
    if [ $# = 0 ]; then
        builtin cd ~/Documents/Github
    else
        builtin cd "$@"
    fi
}
Run Code Online (Sandbox Code Playgroud)

这并不完美,因为它假设您永远不会将该函数调用为

* cd -L
* cd -P
* cd -LP
* etc
Run Code Online (Sandbox Code Playgroud)

(即,在没有显式目录的情况下使用一个或多个受支持的选项。)


更新

这可能更全面一些,但我还没有测试过。

cd () {
    local -a args
    while getopts LP opt "$@"; do
        case $opt in
          -*) args+=( "$opt" ) ;;
        esac
    done
    shift $((OPTIND-1))
    # Assume at most one directory argument, since
    # that is all cd uses
    args+=( "${1:-~/Documents/Github}" )

    builtin cd "${args[@]}"
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,“~/.bashrc”是合适的位置;每个“交互式”shell 在启动后立即获取该文件。(请注意,您编写的任何脚本都将继续使用真正的“cd”,而不是此函数。) (2认同)