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 /boTAB
Po 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?

  • Istnieje coś takiego, jak uzupełnianie wiersza poleceń.
  • Uzupełnianie jest zaimplementowane w pliku /etc/bash_completion
  • Nowe polecenia uzupełniania mogą zostać umieszczone w katalogu /etc/bash_completion.d
  • Możemy wypisać wszystkie bieżące procedury uzupełniania poprzez 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ę.