![相当于符号链接的别名?](https://linux22.com/image/79708/%E7%9B%B8%E5%BD%93%E4%BA%8E%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5%E7%9A%84%E5%88%AB%E5%90%8D%EF%BC%9F.png)
我发现自己需要经常在主文件夹中的几个目录之间跳转,并且厌倦了编写它们。我想要一种更快的方法,传统上这是一个符号链接。
但是,我不想用数十个符号链接弄乱我的主目录。我可以创建一些~/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
这在构建名称列表的函数中定义了一个稍微复杂的完成,并且使jd
be 成为一个函数而不是一个简单的别名,因为我们希望它的行为与仅不同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