您可以使用制表符补全。在许多Linux发行版中,默认情况下会设置bash,以便在您按下[TAB]键时,会列出可能的匹配项,或者如果只有一个匹配项,则会全部填写。对于cd,这通常是当前工作目录的子目录列表。您可以覆盖它,但是我建议改用别名,例如jd
“ jump directory”:
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
构建名称列表的功能中定义了稍微复杂一些的完成,并使其jd
成为函数而不是简单的别名,因为我们希望它的行为不同于just 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'
因为后者永远不会对我有用,我也不明白为什么。这可能是我自己的新问题。:)