Jedną z najmilszych funkcjonalności nowoczesnych powłok jest wbudowana obsługa “uzupełniania”. Funkcje te umożliwiają łatwe uzupełnianie poleceń oraz ich argumentów. Czytajcie dalej, by poznać krótkie wprowadzenie do dodawania swojego własnego podpowiadania poleceń.
Większość powłok umożliwia podpowiadanie poleceń, zwykle związane z klawiszem TAB, które pozwala na uzupełnianie nazw poleceń dostępnych ze ścieżki wykonywania (PATH
), nazw plików czy katalogów. Typowe użycie wygląda następująco:
ls /boTABPo wciśnięciu klawisza TAB, argument
/bo
jest automatycznie zastępowany wartością /boot
.
W ostatnich czasach niektóre powłoki zaczęły umożliwiać nawet więcej: uzupełniać argumenty poleceń. Dwie godne uwagi powłoki pozwalające na to, to zsh i bash. Jako że jestem użytkownikiem basha, omówię tylko nią.
Debianowy pakiet bash
dostarcza plik podpowiedzi /etc/bash_completion
, który konfiguruje podstawową obslugę uzupełniania.
Jeśli go nie używacie, możecie załadować go poprzez wpisanie w Waszej powłoce . /etc/bash_completion
, jak pokazano poniżej:
skx@lappy:~$ . /etc/bash_completion skx@lappy:~$
Po wykonaniu tego polecenia, będziecie w stanie uzupełniać TABem wiele popularnych argumentów programów, na przykład:
skx@lappy:~$ apt-get updTAB skx@lappy:~$ apt-get upgTAB
Ale jak rozszerzyć tę funkcjonalność samemu? Cóż, dostarczone procedury uzupełniania używają kilku wewnętrznych poleceń basha, jak np. complete
. Można ich użyć we własnych skryptach rozruchowych albo, łatwiej, tworząc niewielki plik i umieszczając go w katalogu /etc/bash_completion.d/
.
W momencie, gdy plik bash_completion
jest wykonywany (bądź ładowany), wszystko wewnątrz katalogu /etc/bash_completion.d
jest również ładowane. To sprawia, że dodanie własnych rozszerzeń jest prostą sprawą.
Jednym ze słowników, z których bash potrafi podpowiadać wartości, jest zbiór nazw hostów, co może być przydatne wielu programom.
Zarządzam zdalnie kilkoma komputerami, przy użyciu vnc i zwykle robię to poprzez wywołanie polecenia xvncviewer nazwa_hosta
.
Aby umożliwić bashowi podpowiadanie fragmentów nazw hostów, które wpisuję, zastosujemy komendę complete do poinformowania, że xvncviewer
wymaga nazwy hosta:
skx@lappy:~$ complete -F _known_hosts xvncviewer
Po wykonaniu tej operacji mogę wcisnąć TAB, by uzupełnić nazwy hostów:
skx@lappy:~$ xvncviewer sTAB savannah.gnu.org ssh.tardis.ed.ac.uk scratchy steve.org.uk security.debian.org security-master.debian.org sun skx@lappy:~$ xvncviewer scTAB
Powyższe właśnie uzupełniło dla mnie nazwę hosta scratchy
.
Funkcja _known_hosts
została zdefiniowana w pliku /etc/bash_completion
. Skąd wiedziałem, że mogę jej użyć? Podając polecenie complete -p
, by wyświetlić wszystkie skojarzone nazwy do użycia:
skx@lappy:~$ complete -p .... complete -F _known_hosts tracepath6 complete -F _known_hosts host ...
Czego nauczyliśmy się dotychczas?
/etc/bash_completion
/etc/bash_completion.d
complete -p
W drugiej części zerkniemy na definiowanie własnych procedur obsługujących linię poleceń – podobnych do już istniejących. Będziemy mogli dodać uzupełnianie wiersza poleceń dla własnych programów, lub nieobsługiwanych jeszcze poleceń.
Do tego czasu, poeksperymentujcie trochę.