本系列的第一部分,我们详细讨论了cd-命令,在第二部分,我们深入研究了pushd和popd命令,以及使用场景在其中使用它们。继续命令行的讨论,在本教程中,我们将通过简单易懂的示例来讨论CDPATH环境变量。我们还讨论了有关此变量的一些高级细节。在这样做之前,让我声明本教程中的所有示例都已在Ubuntu14.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/这可以通过运行来实现吗:cdDesktop是的,这是完全可能的。这就是环境变量CDPATH的用武之地。您可以使用此变量来定义cd命令的基本目录。如果你尝试打印它的值,你会看到这个环境变量默认是空的:$echo$CDPATH现在,考虑到上面提到的场景,我们使用这个环境变量来使用/home/himanshu作为cd命令的基础要使用的目录。最简单的方法是:exportCDPATH=/home/himanshu现在我可以做我以前做不到的事了——当当前工作目录位于/home/himanshu/Downloads目录时,成功运行cdDesktop命令。$pwd/home/himanshu/Downloads$cdDesktop//home/himanshu/Desktop$这表明我可以使用cd命令到达/home/himanshu下的任何目录,而无需在cd命令home/himanshu或~中明确指定/,或../(或多个../)。重要您现在应该知道如何使用环境变量CDPATH在/home/himanshu/Downloads和/home/himanshu/Desktop之间轻松切换。现在,考虑以下情况,/home/himanshu/Desktop目录包含一个名为Downloads的子目录,这是要切换到的目录。但是突然你发现cdDownloads会切换到/home/himanshu/Downloads。所以,为了确保这不会发生,您可以这样做:cd./Downloads虽然上面的命令本身很好,但您仍然需要花费一些额外的努力(尽管很小),尤其是每次发生这种情况时去做这个。所以,有一个更优雅的方案来应对,就是按照下面的方式设置CDPATH环境变量。exportCDPATH=".:/home/himanshu"意思是告诉cd命令先搜索当前工作目录下的目录,然后再尝试搜索/home/himanshu目录。当然,cd命令是否以这种方式运行完全取决于您的喜好和要求——本次??讨论的目的是让您知道这可能会发生。正如您现在所知,一旦设置了环境变量CDPATH,它的值-或者它包含的路径集-就是cd命令在系统上搜索目录的位置(当然,使用绝对路径时除外)。因此,确保命令的行为一致完全取决于您。往后,如果一个bash脚本使用带有相对路径的cd命令,最好先清除或重新设置环境变量CDPATH,除非你觉得万一遇到不可预知的麻烦也无所谓。还有一个可选的方法。您可以在测试当前shell是交互式还是非交互式后,在您的.bashrc文件中设置环境变量,而不是使用export命令在终端中设置CDPATH,这样确保您对环境变量的更改仅适用于交互式外壳。路径在环境变量中出现的顺序也很重要。例如,如果当前目录列在/home/himanshu目录之前,则cd命令将首先搜索当前工作目录,然后搜索/home/himanshu目录。但是,如果值为/home/himanshu:.,则搜索首先从/home/himanshu开始,然后转到当前目录。不用说,这会影响cd命令的行为,不注意路径的顺序会造成一些麻烦。需要记住的是,顾名思义,环境变量CDPATH只影响cd命令。也就是说,当你在/home/himanshu/Downloads目录下时,可以使用cdDesktop命令切换到/home/himanshu/Desktop目录,但不能使用ls。以下是示例:$pwd/home/himanshu/Downloads$lsDesktopls:cannotaccessDesktop:Nosuchfileordirectory$但是,有一些简单的解决方法。例如,我们可以使用以下简单的方法来达到目的:$cdDesktop/;ls/home/himanshu/Desktopbackupbackup~Downloadsgdb.htmloutline~outline.txtoutline.txt~但是,并不是每一种情况都能灵活处理。另一个要点:您可能已经观察到,每次运行设置了CDPATH环境变量的cd命令时,该命令都会在输出中显示您切换到的目录的完整路径。不用说,并不是每个人都希望在每次运行cd命令时都能看到这些信息。要确保此输出被抑制,您可以使用以下命令:aliascd='>/dev/nullcd'如果cd命令成功,则上述命令不会输出任何内容,如果失败,则会生成错误消息.***,如果遇到设置CDPATH环境变量后无法使用shell的tab自动补全功能的问题,可以尝试安装并启用bash自动补全(bash-completion)。在这里阅读更多。总而言之,CDPATH环境变量是一把双刃剑,如果在没有充分知识的情况下随意使用,可能会给您带来麻烦,并花费您大量宝贵的时间来进行故障排除。当然,这并不意味着您不应该尝试一下。看看所有可用的选项,如果您得出结论认为使用CDPATH会有很大帮助,请继续使用它。您已经精通CDPATH了吗?你有更多的技巧要分享吗?请在留言中让我们知道你的想法。
