Вы можете использовать вкладку завершения. По умолчанию во многих дистрибутивах Linux bash настроен так, что когда вы нажимаете клавишу [TAB], вы получаете список возможных совпадений, или, если есть только одно совпадение, оно заполняется полностью. Для cd это обычно список подкаталогов текущего рабочего каталога. Вы можете перезаписать это, но я предлагаю вместо этого создать псевдоним, например, jd
для «jump directory»:
alias jd=cd
а затем, определяя «закладки», которые вы хотите в качестве дополнения для JD. Посмотрите на man-странице bash гораздо больше опций (включая автоматическую генерацию результатов на лету из команды или функции), но самый простой способ - это просто список слов с -W
:
полный -W "/ srv / www ~ / tmp ~ / work" jd
Теперь напечатайте jd
и нажмите [TAB], и вы увидите свои «закладки». Введите любую неоднозначную часть, а затем нажмите [TAB], чтобы завершить. (В приведенном выше ~
примере s расширяется до моего домашнего каталога, поэтому первый [TAB] дает мне a /
, и если я 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
его функцией, а не простым псевдонимом, поскольку мы хотим, чтобы он действовал иначе, чем просто 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'
потому что последний никогда не работает для меня, и я не понимаю, почему. Это может быть мой новый вопрос. :)