在本系列的第一部分中,我们详细讨论了cd命令,在第二部分,我们深入研究了pushd和popd命令以及它们派上用场的场景。
继续我们对命令行导航方面的讨论,在本教程中,我们将通过简单易懂的示例来讨论CDPATH环境变量。 我们还将讨论与此变量相关的一些预先详细信息。
但在我们继续之前,值得一提的是,本教程中的所有示例都已在Ubuntu 14.04中使用Bash版本4.3.11(1)进行了测试。
CDPATH环境变量
即使您的命令行工作涉及执行特定目录下的所有操作(例如您的主目录),那么您也必须在切换目录时提供绝对路径。 例如,考虑一下我在/ home / himanshu / Downloads目录中的情况:
$ pwd
/home/himanshu/Downloads
而要求是切换到/ home / himanshu / Desktop目录。 为了做到这一点,通常我必须运行:
cd /home/himanshu/Desktop/
要么
cd ~/Desktop/
要么
cd ../Desktop/
如果我可以运行以下命令,这不容易:
cd Desktop
是的,这是可能的。 这是CDPATH环境变量所在的位置。您可以使用此变量来定义cd命令的基本目录。
如果您尝试打印其值,您将看到默认情况下,此env变量为空:
$ 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或〜或../ (或多个../ )下的/ home / himanshu下的任何目录下执行cd。
要记住的要点
所以你现在知道我们如何使用CDPATH环境变量轻松切换到/ from / home / himanshu / Downloads from / to / home / himanshu / Desktop 。 现在考虑一种情况,在/ home / himanshu / Desktop目录中包含一个名为Downloads的子目录 ,而后者则是您要切换的。
但突然间你意识到,做一个cd桌面将带你到/ home / himanshu /桌面 。 所以,为了确保不会发生,你做:
cd ./Downloads
虽然上述命令本身没有问题,但这是您的一个额外的努力(无论如何),特别是考虑到每次出现这种情况时都必须这样做。 这个问题的一个更优雅的解决方案可以是以下列方式最初设置CDPATH变量:
export CDPATH =“。:/ home / himanshu”
这意味着你告诉cd命令首先查找当前工作目录中的目录,然后尝试搜索/ home / himanshu目录。 当然,您是否希望cd命令行为完全取决于您的偏好或要求 - 我在后面讨论这一点的想法是让您知道这种情况可能会出现。
正如您现在所理解的那样,一旦设置了CDPATH env变量,它的值 - 或者它包含的路径集是系统上唯一的cd命令搜索目录的地方(除了当然的情况)你使用绝对路径)。 所以,完全取决于您确保命令的行为保持一致。
继续前进,如果有一个使用具有相对路径的cd命令的bash脚本,那么最好先清除或取消设置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='>/dev/null cd'
当cd命令成功时,上述命令将静音输出,但是将允许在命令失败时产生错误消息。
最后,如果您在设置CDPATH环境变量后遇到问题,则无法使用shell的选项卡完成功能,那么可以尝试安装并启用bash-completion。
结论
CDPATH环境变量是一把双刃剑 - 如果不谨慎和完整的知识使用,那么它可能会使您陷入一些复杂的陷阱,这可能需要大量的宝贵时间才能得到解决。 当然,这并不意味着你永远不应该试一试; 只是评估所有可用的选项,如果你得出结论,使用CDPATH将是很大的帮助,那么请继续使用它。
你一直在使用CDPATH吗? 你有更多的分享提示吗? 请在下面的评论中分享您的想法。