Эквивалент псевдонима для символической ссылки?

18

Мне часто приходится прыгать по нескольким каталогам в моей домашней папке и уставать от их написания. Я хотел бы более быстрый подход, который традиционно будет символической ссылкой.

Однако я не хочу загромождать свой домашний каталог десятками символических ссылок. Я мог бы создать какой-то ~/links/каталог и загромождать его символическими ссылками, но он все еще уродлив. Кроме того, я могу захотеть создать символические ссылки, которые меняются каждый день (определяется в .bashrc) для перехода в каталог нынешних дней.

Есть ли способ эффективно использовать псевдоним символической ссылки, создавая что-то, что будет распознаваться как ссылка для быстрой навигации, но на самом деле не появится, когда я создаю lsсвой домашний каталог, и не будет действовать после текущего сеанса?

dsollen
источник
4
вы можете посмотреть в pushd и popd
Rui F Ribeiro
Я считаю, что подход Йеруна Янссена может быть адаптирован и дешев
Theophrastus
2
Какую оболочку вы используете?
Жиль "ТАК ... перестать быть злым"
@Theophrastus Heh - это то, что я в основном не так элегантно изложил в своем ответе.
Mattdm
3
не совсем то, что вы ищете, но все же может пригодиться при переходе назад и вперед между двумя директориями: cd -воля cdк последнему каталогу была ранее. Следовательно, если вы сделаете это дважды, вы вернетесь к тому, с чего начали ... очень хорошо для ситуации "о, я забыл отредактировать файл someFile.txt в предыдущем месте" => Просто:, cd -отредактировать файл someFile.txtcd -
dingalapadum

Ответы:

12

Вы можете использовать вкладку завершения. По умолчанию во многих дистрибутивах 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'потому что последний никогда не работает для меня, и я не понимаю, почему. Это может быть мой новый вопрос. :)

mattdm
источник
очень интересно. Один улов, хотя, все еще требует, чтобы напечатать полную ссылку, или по крайней мере достаточно ссылки, чтобы стать не двусмысленным, прежде чем я смогу завершить с jd. Есть ли способ добавить псевдонимы в команды jd, чтобы сократить их? или сделать их относительно каталога, где я могу хранить символические ссылки, я полагаю.
dsollen
@dsollen Смотрите обновление :)
mattdm
это сработало отлично. Честно говоря, я не ожидал хорошего ответа на этот вопрос, но именно этого я и хотел. Я предполагаю довольно частое использование этого, и оно кажется достаточно чистым, чтобы добавить в список вещей, которые я изменяю, когда я получаю новую ВМ (у меня даже есть автоматизированный способ клонировать мои стандартные изменения среды в новый vm lol). Большое спасибо. В какой-то момент, когда у меня будет больше свободного времени, я выясню, как работает синтаксис для COMPREPLY;)
dsollen
18

У псевдонимов оболочки есть функция, с которой вы можете (некоторые) дополнять имена (обычно привязаны tab). Кроме того, вы можете использовать CDPATHфункцию, которая "недавно" (в течение последних 5-6 лет) была улучшена для поддержки завершения имени. Если это работает для вас, у вас есть преимущество в том, что вы вводите фактическое имя каталога, а не мнемонику для него.

Согласно руководству по bash

CDPATH
Разделенный двоеточиями список каталогов, используемых в качестве пути поиска для cdвстроенной команды.

Дальнейшее чтение:

Томас Дики
источник
Не знал о CDPATHпеременной среды, спасибо. Я мог бы добавить свой git_reposкаталог в эту переменную ....
Wildcard
16

Для каталогов, которые вы часто посещаете, но не меняете ежедневно, другой вариант - просто добавить несколько aliasкоманд в ваш .bashrcфайл:

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

У друга около 50 из них; У меня есть горстка; быстро и просто. Только

cdo

изменить каталог на / u01 / app / oracle

Марк Стюарт
источник
В самом деле. Я использовал этот механизм с начала 1990-х годов.
Wallyk
7

Я рекомендую pushdи popd.

Лично я нахожу их удобными при разработке / чтении исходного кода, когда задействовано несколько каталогов.

Они эффективно реализуют структуру стека / LIFO, где вы нажимаете на каталог ( pushd), а следующая команда каталога POP ( popd) получает его.

Итак, когда внутри dir, вы бы сделали:

pushd .

И когда вам нужно получить его, вы делаете

popd

Вы можете выполнить несколько pushdопераций, а затем выполнить соответствующие действия popd, чтобы вернуться в каталоги.

Я оставлю здесь ссылку.

http://www.eriwen.com/bash/pushd-and-popd/

Руи Ф Рибейро
источник
1
Это решение, которое я также использую, за исключением того, что я мало пользуюсь popd. Я заполняю свой dirsсписок (который заполняется pushdкомандами) всеми каталогами, которые я хочу посетить / работать в течение этого куска времени, затем я запускаю pushd +1. Затем я цикл может просматривать каталоги с простым , !puкоторый очень быстро. (Обратите внимание, что как в Ubuntu, так и в CentOS pushdэто единственная команда, доступная в чистой установке, которая начинается с pu.)
Wildcard
3

Вы можете просто поместить их как переменные в свой ~/.bashrc, и тогда они будут только $отсутствовать.

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

$ cd $myproj
Эван Меллор
источник
3

Очевидный ответ - переменные , те символические вещи в оболочке, которые обозначают другие вещи, аналогично символическим ссылкам в файловой системе.

path/to/project $ project=$PWD
path/to/project $ cd $elsewhere   # Previously created
path/to/elsewhere $ cd $project
path/to/project $ logout          # Variables gone, as required

В любой приличной оболочке вы получаете Tabзавершение имен переменных, что в дальнейшем помогает.

Kaz
источник