Еквівалент псевдоніма для символічного зв’язку?


18

Мені здається, що мені потрібно часто перестрибувати декілька каталогів у моїй домашній папці і втомитися їх писати. Мені б хотілося швидшого підходу, який традиційно був би символічною ланкою.

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

Чи існує спосіб ефективного псевдоніму символічного посилання, створивши те, що буде розпізнано як посилання для швидкої навігації, але насправді не з’явиться, коли я роблю lsдомашній каталог і не триватиме після поточного сеансу?


4
ви можете заглянути в пудд і попд
Rui F Ribeiro

я вважаю, що підхід Джероана
Теофраст

2
Яку оболонку ви використовуєте?
Жил "ТАК - перестань бути злим"

@Theophrastus Хе - це в основному те, що я повторно реалізував не так елегантно у своїй відповіді.
mattdm

3
не зовсім те, що ви шукаєте, але все-таки може стати в нагоді при стрибках між двома режисерами: cd -воля cdв останній каталог була раніше. Отже, якщо ви зробите це двічі, ви повернетесь туди, з чого почали ... дуже приємно для ситуації "о, я забув редагувати someFile.txt у попередньому місці" => Просто:, cd -редагувати someFile.txtcd -
dingalapadum

Відповіді:


12

Можна скористатися заповненням вкладки. За замовчуванням у багатьох дистрибутивах Linux, bash налаштовується так, що після натискання клавіші [TAB] вам надається список можливих збігів, або якщо є лише одна відповідність, все заповнюється. Для CD це звичайно перелік підкаталогів поточного робочого каталогу. Ви можете це перезаписати, але я пропоную замість цього створити псевдонім, наприклад, jdдля "каталогу стрибків":

alias jd=cd

а потім, визначивши потрібні "закладки" як доповнення до jd. Подивіться на сторінку bash man, щоб отримати набагато більше варіантів (включаючи автоматичне генерування результатів під час руху за допомогою команди чи функції), але найпростішим способом є лише список слів із -W:

завершити -W "/ srv / www ~ / tmp ~ / робота" 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

Це визначає дещо складніше завершення fuction _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'що останній ніколи не працює на мене, і я не розумію, чому. Це може бути новим моїм власним питанням. :)


дуже цікаво. Один улов, однак, він все ще вимагає ввести повне посилання або, принаймні, достатньо посилання, щоб стати неоднозначним, перш ніж я можу завершити з jd. Будь-який спосіб додати псевдоніми до команд jd, щоб скоротити їх? або зробити їх відносно каталогу, де я можу зберігати символічні посилання, я думаю.
dsollen

@dsollen Дивіться оновлення :)
mattdm

це спрацювало чудово. Чесно кажучи, я не очікував гарної відповіді на це запитання, але це дуже точно те, що я хотів. Я передбачу зовсім небагато використання цього, і він відчуває себе досить чистим, щоб додати до списку речей, які я змінюю, коли я отримую новий VM (у мене навіть є автоматизований спосіб клонувати мої стандартні екологічні зміни до нового vm lol). Дуже дякую. У якийсь момент, коли у мене буде більше вільного часу, я зрозумію, як працює синтаксис для КОМПЛЕКТУ;)
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, де ви PUSH каталог ( 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доповнення до імен змінних, що додатково допомагає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.