Możesz użyć uzupełniania tabulatorów. Domyślnie w wielu dystrybucjach Linuksa bash jest skonfigurowany tak, że gdy naciśniesz klawisz [TAB], otrzymasz listę możliwych dopasowań, lub jeśli jest tylko jedno dopasowanie, wszystko jest wypełnione. W przypadku cd jest to zwykle lista podkatalogów bieżącego katalogu roboczego. Możesz to zastąpić, ale zamiast tego sugeruję utworzenie aliasu, na przykład jd
dla „jump directory”:
alias jd=cd
a następnie zdefiniowanie „zakładek”, które chcesz uzupełnić dla jd. Spójrz na stronę podręcznika użytkownika bash, aby uzyskać o wiele więcej opcji (w tym automatyczne generowanie wyników w locie z polecenia lub funkcji), ale najprostszym sposobem jest po prostu lista słów z -W
:
complete -W "/ srv / www ~ / tmp ~ / work" jd
Teraz wpisz jd
i naciśnij [TAB], a zobaczysz swoje „zakładki”. Wpisz dowolną niejednoznaczną część, a następnie naciśnij [TAB], aby zakończyć. (W powyższym, ~
s rozwiń do mojego katalogu domowego, więc pierwszy [TAB] daje mi /
, a jeśli uderzę w
i [TAB] ponownie, /srv/www
jest wypełniony.)
Oczywiście, włóż to, ~/.bash_profile
aby było trwałe.
Lub możemy przenieść to na wyższy poziom. Utwórz katalog ~/.shortcuts
- zaczynając od kropki, będzie on ukryty i nie będzie zajmował ładnego, czystego katalogu domowego - i wypełnisz go symbolicznymi linkami do wybranych katalogów. Następnie umieść to w swoim ~ / .bash_profile:
_list_shortcuts()
{
COMPREPLY=($( compgen -W "$( ls ~/.shortcuts )" -- ${COMP_WORDS[COMP_CWORD]} ))
}
jd()
{
cd -P ~/.shortcuts/$1
}
complete -F _list_shortcuts jd
Definiuje to nieco bardziej skomplikowane zakończenie _list_shortcuts
tworzenia listy nazw i sprawia, że staje jd
się ona funkcją, a nie prostym aliasem, ponieważ chcemy, aby działała inaczej niż tylko cd
. -P
Flagę cd
czyni go rozwiązać dowiązania symboliczne, więc wszystko staje się przejrzyste magia. Twoje nazwy skrótów nie muszą nawet odpowiadać celom.
Więc:
$ 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
I, dla dodatkowej dawki fantazji, zrób jd
listę wszystkich skrótów, gdy zostanie wykonany bez żadnych parametrów:
jd()
{
if [[ -z "$1" ]]; then
(cd ~/.shortcuts; stat -c '%N' *)
else
cd -P ~/.shortcuts/$1
fi
}
Uwaga: używam compgen -W $( cmd )
zamiast tego, compgen -C 'cmd'
ponieważ ten drugi nigdy dla mnie nie działa i nie rozumiem dlaczego. To może być moje nowe pytanie. :)