summaryrefslogtreecommitdiff
path: root/template/content/2016/10/16/an-introduction-to-bash-completion-part-1.tpl
blob: 714fd773108adf66f4f7a9fb47fd9e2bff442058 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
<div class="page-header">
  <h1>Wprowadzenie do uzupełniania powłoki bash, część 1</h1>
  <a href="2016/10/16/an-introduction-to-bash-completion-part-1/">
    <time class="text-muted" title="2016-10-16 11:05" datetime="2016-10-16T11:05">Sunday, October 16, 2016</time>
  </a>
</div>

<div class="panel panel-default">
  <div class="panel-body">
    <a href="https://debian-administration.org/article/316/An_introduction_to_bash_completion_part_1">
      Oryginalny artykuł autorstwa Steve'a Kempa (po angielsku).
    </a><br />
    <a href="2016/10/16/an-introduction-to-bash-completion-part-2/">
      Druga część wprowadzenia.
    </a>
  </div>
</div>

<div class="panel panel-default">
  <div class="panel-body">
    <p>
      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ń.
    </p>
    <p>
      Większość powłok umożliwia podpowiadanie poleceń, zwykle związane z klawiszem <kbd>TAB</kbd>, które pozwala na uzupełnianie nazw poleceń dostępnych ze ścieżki wykonywania (<code>PATH</code>), nazw plików czy katalogów. Typowe użycie wygląda następująco:
      <pre>
ls /bo<kbd>TAB</kbd></pre>
      Po wciśnięciu klawisza <kbd>TAB</kbd>, argument <code>/bo</code> jest automatycznie zastępowany wartością <code>/boot</code>.
    </p>
    <p>
      W ostatnich czasach niektóre powłoki zaczęły umożliwiać nawet więcej: uzupełniać <em>argumenty</em> poleceń. Dwie godne uwagi powłoki pozwalające na to, to zsh i bash. Jako że jestem użytkownikiem basha, omówię tylko nią.
    </p>
    <p>
      <a href="http://packages.debian.org/bash">Debianowy pakiet <code>bash</code></a> dostarcza plik podpowiedzi <code>/etc/bash_completion</code>, który konfiguruje podstawową obslugę uzupełniania.
    </p>
    <p>
      Jeśli go nie używacie, możecie załadować go poprzez wpisanie w Waszej powłoce <code>. /etc/bash_completion</code>, jak pokazano poniżej:
      <pre>skx@lappy:~$ . /etc/bash_completion
skx@lappy:~$</pre>
    </p>
    <p>
      Po wykonaniu tego polecenia, będziecie w stanie uzupełniać <kbd>TAB</kbd>em wiele popularnych argumentów programów, na przykład:
      <pre>skx@lappy:~$ apt-get upd<kbd>TAB</kbd>
skx@lappy:~$ apt-get upg<kbd>TAB</kbd></pre>
    </p>
    <p>
      Ale jak rozszerzyć tę funkcjonalność samemu? Cóż, dostarczone procedury uzupełniania używają kilku wewnętrznych poleceń basha, jak np. <code>complete</code>. Można ich użyć we własnych skryptach rozruchowych albo, łatwiej, tworząc niewielki plik i umieszczając go w katalogu <code>/etc/bash_completion.d/</code>.
    </p>
    <p>
      W momencie, gdy plik <code>bash_completion</code> jest wykonywany (bądź ładowany), wszystko wewnątrz katalogu <code>/etc/bash_completion.d</code> jest również ładowane. To sprawia, że dodanie własnych rozszerzeń jest prostą sprawą.
    </p>
    <p>
      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.
    </p>
    <p>
      <a href="http://www.debian-administration.org/articles/135">Zarządzam zdalnie kilkoma komputerami, przy użyciu vnc</a> i zwykle robię to poprzez wywołanie polecenia <code>xvncviewer nazwa_hosta</code>.
    </p>
    <p>
      Aby umożliwić bashowi podpowiadanie fragmentów nazw hostów, które wpisuję, zastosujemy komendę complete do poinformowania, że <code>xvncviewer</code> wymaga nazwy hosta:
      <pre>skx@lappy:~$ complete -F _known_hosts xvncviewer</pre>
    </p>
    <p>
      Po wykonaniu tej operacji mogę wcisnąć <kbd>TAB</kbd>, by uzupełnić nazwy hostów:
      <pre>skx@lappy:~$ xvncviewer s<kbd>TAB</kbd>
savannah.gnu.org            ssh.tardis.ed.ac.uk
scratchy                    steve.org.uk
security.debian.org         security-master.debian.org
sun
skx@lappy:~$ xvncviewer sc<kbd>TAB</kbd></pre>
    </p>
    <p>
      Powyższe właśnie uzupełniło dla mnie nazwę hosta <code>scratchy</code>.
    </p>
    <p>
      Funkcja <code>_known_hosts</code> została zdefiniowana w pliku <code>/etc/bash_completion</code>. Skąd wiedziałem, że mogę jej użyć? Podając polecenie <code>complete -p</code>, by wyświetlić wszystkie skojarzone nazwy do użycia:
      <pre>skx@lappy:~$ complete -p
....
complete -F _known_hosts tracepath6
complete -F _known_hosts host
...</pre>
    </p>
    <p>
      Czego nauczyliśmy się dotychczas?
      <ul>
        <li>Istnieje coś takiego, jak uzupełnianie wiersza poleceń.</li>
        <li>Uzupełnianie jest zaimplementowane w pliku <code>/etc/bash_completion</code></li>
        <li>Nowe polecenia uzupełniania mogą zostać umieszczone w katalogu <code>/etc/bash_completion.d</code></li>
        <li>Możemy wypisać wszystkie bieżące procedury uzupełniania poprzez <code>complete -p</code></li>
      </ul>
    </p>
    <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ń.
    </p>
    <p>
      Do tego czasu, poeksperymentujcie trochę.
    </p>
  </div>
</div>