在这个系列的第一部分[1],我们详细地讨论了cd -命令,在第二部分[2],我们深入探究了pushd和popd两个命令,以及它们使用的场景。
继续对命令行的讨论,在这篇教程中,我们将会通过简单易懂的实例来讨论CDPATH这个环境变量。我们也会讨论关于此变量的一些进阶细节。
在这之前,先声明一下此教程中的所有实例都已经在 Ubuntu 14.04 和 4.3.11(1) 版本的 Bash 下测试过。
环境变量 CDPATH
即使你的命令行所有操作都在特定的目录下 - 例如你的主目录,然而在你切换目录时也不得不提供绝对路径。比如,考虑我现在的情况,就是在/home/himanshu/Downloads目录下:
$ pwd
/home/himanshu/Downloads
现在要求切换至/home/himanshu/Desktop目录,我一般会这样做:
cd /home/himanshu/Desktop/
或者
cd ~/Desktop/
或者
cd ../Desktop/
能不能只是运行以下命令就能简单地实现呢:
cd Desktop
是的,这完全有可能。这就是环境变量CDPATH出现的时候了。你可使用这个变量来为cd命令定义基础目录。
如果你尝试打印它的值,你会看见这个环境变量默认是空值的:
$ echo $CDPATH
现在 ,考虑到上面提到的场景,我们使用这个环境变量,将/home/himanshu作为cd命令的基础目录来使用。
最简单的做法这样:
export CDPATH=/home/himanshu
现在,我能做到之前所不能做到的事了 - 当前工作目录在/home/himanshu/Downloads目录里时,成功地运行了cd Desktop命令。
$ pwd
/home/himanshu/Downloads
$ cd Desktop/
/home/himanshu/Desktop
$
这表明了我可以使用cd命令来到达/home/himanshu下的任意一个目录,而不需要在cd命令中显式地指定/home/himanshu或者~,又或者是../(或者多个../)。
要点
现在你应该知道了怎样利用环境变量CDPATH在/home/himanshu/Downloads和/home/himanshu/Desktop之间轻松切换。现在,考虑以下这种情况, 在/home/himanshu/Desktop目录里包含一个名字叫做Downloads的子目录,这是将要切换到的目录。
但突然你会意识到cd Desktop会切换到/home/himanshu/Desktop。所以,为了确保这不会发生,你可以这样做:
cd ./Downloads
虽然上述命令本身没有问题,但你还是需要耗费点额外的精力(虽然很小),尤其是每次这种情况发生时你都不得不这样做。所以,有一个更加优雅的解决方案来处理,就是以如下方式来设定CDPATH环境变量。
export CDPATH=".:/home/himanshu"
它的意思是告诉cd命令先在当前的工作目录查找该目录,然后再尝试搜寻/home/himanshu目录。当然,cd命令是否以这样的方式运行,完全取决于你的偏好和要求 - 讨论这一点的目的是为了让你知道这种情况可能会发生。
就如你现在所知道的,一旦环境变量CDPATH被设置,它的值 - 或者它所包含的路径集合 - 就是系统中cd命令搜索目录的地方 ( 当然除了使用绝对路径的场景 )。所以,完全取决于你来确保该命令行为的一致性。
继续说,如果一个 bash 脚本以相对路径使用cd命令,最好还是先清除或者重置环境变量CDPATH,除非你觉得遇上不可预测的麻烦也无所谓。还有一个可选的方法,比起在终端使用export命令来设置CDPATH,你可以在测试完当前的 shell 是交互式还是非交互式之后,再在你的.bashrc文件里设置环境变量,这样可以确保你对环境变量的改动只对交互式 shell 生效。
环境变量中,路径出现的顺序同样也是很重要。举个例子,如果当前目录是在/home/himanshu目录之前列出来,cd命令就会先搜索当前的工作目录然后才会搜索/home/himanshu目录。然而,如果该值为/home/himanshu:.,搜索就首先从/home/himanshu开始,然后到当前目录。不用说,这会影响cd命令的行为,并且不注意路径的顺序可能会导致一些麻烦。
要牢记在心的是,环境变量CDPATH,就像其名字表达的,只对cd命令有作用。意味着在/home/himanshu/Downloads目录里面时,你能运行cd Desktop命令来切换到/home/himanshu/Desktop目录,但你不能使用ls。以下是一个例子:
$ pwd
/home/himanshu/Downloads
$ ls Desktop
ls: cannot access Desktop: No such file or directory
$
然而,这还是有简单的变通处理的。例如,我们可以用以下不怎么费力的方式来达到目的:
$ cd Desktop/;ls
/home/himanshu/Desktop
backup backup~ Downloads gdb.html outline~ outline.txt outline.txt~
不过,不是每种情况就能变通处理的。
另一个重点是:就像你可能已经观察到的,每次你使用CDPATH环境变量集来运行cd命令时,该命令都会在输出里显示你切换到的目录的完整路径。不用说,不是所有人都想在每次运行cd命令时看到这些信息。
为了确保该输出被制止,你可以使用以下命令:
alias cd='
|