相当于符号链接的别名?

相当于符号链接的别名?

我发现自己需要经常在主文件夹中的几个目录之间跳转,并且厌倦了编写它们。我想要一种更快的方法,传统上这是一个符号链接。

但是,我不想用数十个符号链接弄乱我的主目录。我可以创建一些~/links/目录和混乱带有符号链接,但它仍然很丑陋。此外,我可能想创建每天更改的符号链接(在 .bashrc 中定义)以跳转到当前目录。

有没有一种方法可以有效地为符号链接添加别名,创建一些将被识别为快速导航链接的东西,但当我执行我的主目录时实际上不会出现ls,并且不会持续超出当前会话?

答案1

Shell 别名具有可以对其进行(某些)名称完成的功能(通常绑定到tab)。或者,您可以使用该CDPATH功能,该功能“最近”(在过去 5-6 年内)已得到改进以支持名称完成。如果这对您有用,那么它的优点是您键入的内容是目录的实际名称,而不是助记符。

根据 bash 手册

CDPATH
以冒号分隔的目录列表,用作搜索路径cd内置命令。

进一步阅读:

答案2

对于您经常访问但不会每天更改的目录,另一种选择是alias在文件中包含几个命令.bashrc

alias cdo="cd /u01/app/oracle"
alias cdw="cd /var/www/html" 

一位朋友大约有 50 个;我有一把;快捷方便。只是

cdo

将目录更改为 /u01/app/oracle

答案3

您可以使用制表符补全。默认情况下,在许多 Linux 发行版上,bash 的设置是这样的:当您按下 [TAB] 键时,您会得到一个可能匹配的列表,或者如果只有一个匹配,则全部被填写。对于 cd,这通常是当前工作目录的子目录列表。您可以覆盖它,但我建议改为创建一个别名,例如jd“跳转目录”:

alias jd=cd

然后,定义您想要的“书签”作为 jd 的补全。查看 bash 手册页以获取更多选项(包括从命令或函数动态自动生成结果),但最简单的方法只是一个单词列表,其中-W

完整 -W "/srv/www ~/tmp ~/work" jd

现在,输入jd并点击 [TAB],您将看到您的“书签”。键入任何不明确的部分,然后按 [TAB] 完成。 (在上面,~s 扩展到我的主目录,所以第一个 [TAB] 给了我一个/,如果我w再次点击 [TAB] ,/srv/www就会被填写。)

当然,将其放入~/.bash_profile以使其持续存在。

或者,我们可以将其提升到一个新的水平。创建一个目录~/.shortcuts- 以点开头,它将被隐藏,不会弄乱您漂亮干净的主目录 - 并用指向您所需目录的符号链接填充该目录。然后,放在你的 ~/.bash_profile 中:

_list_shortcuts() 
{ 
    COMPREPLY=($( compgen -W "$( ls ~/.shortcuts )" -- ${COMP_WORDS[COMP_CWORD]} ))
}
jd()
{
    cd -P ~/.shortcuts/$1
}
complete -F _list_shortcuts jd

_list_shortcuts这在构建名称列表的函数中定义了一个稍微复杂的完成,并且使jdbe 成为一个函数而不是一个简单的别名,因为我们希望它的行为与仅不同cd。该-P标志使其cd解析符号链接,因此一切都变得透明魔法。您的快捷方式名称甚至不必与目标匹配。

所以:

$ ls -l ~/.shortcuts/
total 0
lrwxrwxrwx. 1 mattdm mattdm 16 Dec 17 19:44 tmp -> /home/mattdm/tmp
lrwxrwxrwx. 1 mattdm mattdm 17 Dec 17 19:44 WORK -> /home/mattdm/work
lrwxrwxrwx. 1 mattdm mattdm  8 Dec 17 19:44 www -> /srv/www
$ jd tmp
$ pwd
/home/mattdm/tmp
$ jd WORK
/home/mattdm/work

并且,为了获得额外的效果,请jd在不带任何参数的情况下执行时列出所有快捷方式:

jd()
{
    if [[ -z "$1" ]]; then
      (cd ~/.shortcuts; stat -c '%N' *)
    else
      cd -P ~/.shortcuts/$1
    fi
}

注意:我使用compgen -W $( cmd )而不是compgen -C 'cmd'因为后者对我不起作用,我不明白为什么。这可能是我自己的一个新问题。 :)

答案4

您可以将它们作为变量放入您的 中~/.bashrc,然后它们就消失了$

$ cat ~/.bashrc
if [ "$PS1" ]
then
    export myproj=~/todays/fancy/project
fi

$ cd $myproj

相关内容