Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 更改cd默认目录(bash)_Linux_Bash_Terminal_Cd - Fatal编程技术网

Linux 更改cd默认目录(bash)

Linux 更改cd默认目录(bash),linux,bash,terminal,cd,Linux,Bash,Terminal,Cd,我正在寻找一种方法来更改cd的默认目录,我想知道这是否可行。我试着加上 alias "cd=cd ~/Documents/Github" 别名“cd=cd~/Documents/Github” 但是这显然不起作用,因为它破坏了cd命令,所以除了转到该目录之外,您不能使用cd执行任何操作。是否有一些出口,我可以投入。bashrc来做这件事?我不想更改我的主目录,只是默认目录cd转到。我这样做是因为我经常使用cd切换到我正在编程的默认目录,并且不希望每次切换到目录~/workspace时都必须键入c

我正在寻找一种方法来更改cd的默认目录,我想知道这是否可行。我试着加上

alias "cd=cd ~/Documents/Github" 别名“cd=cd~/Documents/Github”
但是这显然不起作用,因为它破坏了cd命令,所以除了转到该目录之外,您不能使用cd执行任何操作。是否有一些出口,我可以投入。bashrc来做这件事?我不想更改我的主目录,只是默认目录cd转到。我这样做是因为我经常使用cd切换到我正在编程的默认目录,并且不希望每次切换到目录
~/workspace
时都必须键入
cd~/workspace
cd
,然后再键入
cd workspace

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

cd () {
    if [ $# = 0 ]; then
        builtin cd ~/Documents/Github
    else
        builtin cd "$@"
    fi
}
这并不完美,因为它假定您永远不会将函数作为

* cd -L
* cd -P
* cd -LP
* etc
(即,使用一个或多个受支持的选项,而不使用显式目录。)


更新

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

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[@]}"
}

这是默认的主位置

$ pwd
/home/######
现在你可以像这样重置它

$ export HOME=/tmp
$ cd
$ pwd
/tmp

现在取决于您将新的$HOME定义放在何处-
.bashrc
,或者其他任何东西这里有一个使用别名的更简单的替代方法:

alias cd='HOME=~/Documents/Github cd'
  • 虽然这重新定义了
    $HOME
    ,但它只对
    cd
    命令进行定义,因此应该是安全的(*)
  • 这也消除了任何自定义参数预解析的需要
如果将其放置在
~/.bashrc
中,则应获得所需的行为

请注意,默认情况下,此别名在脚本(非交互式Shell)中无效,因为默认情况下在脚本中禁用别名扩展(使用
shopt-s expand_alias
显式启用)



(*)@chepner指出了一个限制:有了别名,您将无法执行
HOME=/where/else cd
,也就是说,您将无法再次临时重新定义(覆盖)
$HOME
。不过,正如他进一步指出的那样,很难想象为什么会有人想这样做。

使用一个新的别名:
alias cdd=“cd/your/new/dir”
我也想到了这一点,但我宁愿不必使用不同的命令将cd复制到该目录。谢谢,这不是有点危险吗?如果其他脚本使用
$HOME
?@Andrew,那也是我关心的问题。我真的不想更改主目录,只想更改cd的功能。更改主目录是个坏主意。大多数程序将在
$HOME
中查找其配置文件;例如,
vim
在启动时查找
$HOME/.vimrc
。当homes安装在某个不寻常的位置时,我做了几次,所以我想在某些情况下这是可以的。是的,
~/.bashrc
将是合适的位置;该文件在启动后立即由每个交互式shell获取。(请注意,您编写的任何脚本都将继续使用真正的
cd
,而不是此函数。)+1除了不能将别名与
HOME=/where/else cd
(说真的,您为什么要这么做?)之外,这比我的shell函数简单得多。+1其他几个答案也很有效,但我最喜欢这个。谢谢不客气@谢天谢地:为了完整起见,我把它添加到了答案中。至于为什么有人想。。。我有项目,我通常在一个特定的项目上工作。我想,如果我有一个简单的方法将cd放回项目的顶级目录,那就太好了。因此,当我开始处理一个项目时,我可以执行project=
pwd
,然后编辑下面的cd函数,如果设置了,则默认为$project。