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 jddla „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 jdi 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ę wi [TAB] ponownie, /srv/wwwjest wypełniony.)
Oczywiście, włóż to, ~/.bash_profileaby 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_shortcutstworzenia listy nazw i sprawia, że staje jdsię ona funkcją, a nie prostym aliasem, ponieważ chcemy, aby działała inaczej niż tylko cd. -PFlagę cdczyni 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 jdlistę 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. :)