Pokud v Linuxu při psaní příkazu dvakrát stisknete TAB, zobrazí se seznam všech dostupných příkazů, které začínají napsanými znaky.
Není to nic nového, pravděpodobně o tom už víte. Tato funkce se nazývá dokončení bash. Základní doplnění názvu souboru a adresáře je standardně dostupné v příkazovém řádku bash.
Ale můžeme toto dokončení bash přetížit a posunout ho na další úroveň pomocí kompletního příkazu.
Tento tutoriál vysvětluje, jak můžeme použít automatické dokončování na možnosti a argumenty příkazu pomocí programovatelného dokončování.
Pokud například po zadání příkazu write dvakrát stisknete tabulátor, automatické dokončování zobrazí seznam uživatelů pro provedení operace zápisu.
$ write [TAB][TAB] bala raj jason randy john ritu mayla thomas nisha www-data
V následujícím příkladu by se zobrazily dostupné názvy hostitelů pro příkaz telnet:
$ telnet [TAB][TAB] localhost dev-db fileserver
Chcete-li získat programovatelné dokončení ve svém terminálu, stačí spustit /etc/bash_completion, jak je uvedeno níže,
# . /etc/bash_completion
Můžete také odkomentovat níže uvedené řádky v /etc/bash.bashrc (z ubuntu linux 13.04), abyste nemuseli explicitně spouštět výše uvedený příkaz,
enable bash completion in interactive shells if ! shopt -oq posix; then if [ -f /usr/share/bash-completion/bash_completion ]; then . /usr/share/bash-completion/bash_completion elif [ -f /etc/bash_completion ]; then . /etc/bash_completion fi fi
V případě, že nenajdete tyto řádky a soubor /etc/bash_completion, pak stačí nainstalovat balíček s názvem bash_completion pomocí apt-get
1. Zobrazit existující dokončení bash
Po povolení programovatelného dokončování bash jsou definovány sady dokončování bash. Příkaz complete se používá k definování dokončení bash.
Chcete-li zobrazit stávající dokončení bash, použijte příkaz complete, jak je znázorněno níže.
complete -p | less
Volba -p je ve výše uvedeném příkladu volitelná.
2. Seznam standardního dokončení v Bash
Bash ve výchozím nastavení poskytuje uživatelům Linuxu následující standardní dokončení.
- Dokončení názvu proměnné
- Dokončení uživatelského jména
- Dokončení názvu hostitele
- Dokončení názvu cesty
- Dokončení názvu souboru
O nich jsme hovořili v našem dřívějším článku o dokončení standardu bash.
3. Definujte dokončení pro získávání příkazů
Definujte dokončení pomocí příkazu -c, abyste získali seznam dostupných příkazů jako argument. V následujícím příkladu je definováno dokončení pro který příkaz,
$ complete -c which $ which [TAB][TAB] Display all 2116 possibilities? (y or n)
Jak je vidět výše, stisknutím „y“ se zobrazí seznam všech příkazů.
4. Definujte dokončení pro získávání adresářů
S volbou d lze definovat dokončení tak, aby se jako argument dostaly pouze názvy adresářů. V následujícím příkladu je definováno dokončení pro ls,
$ ls countfiles.sh dir1/ dir2/ dir3/ $ complete -d ls $ ls [TAB][TAB] dir1/ dir2/ dir3/
Jak je vidět výše, stisknutím tabulátoru zobrazíte pouze adresáře.
5. Definujte dokončení pro získání názvů úloh na pozadí
Po dokončení je také možné získat názvy úloh jako argumenty pro příkazy. Možnost j se používá k předání názvů úloh jako argumentu příkazové úloze, jak je znázorněno níže
$ jobs [1]- Stopped cat [2]+ Stopped sed 'p' $ complete -j ./list_job_attrib.sh $ ./list_job_attrib.sh [TAB][TAB] cat sed
Když mluvíme o úlohách na pozadí, měli byste také vědět, jak spravovat úlohy na pozadí Linuxu pomocí těchto příkladů.
6. Dokončení pomocí předpony a přípony
Dokončení lze definovat s požadovanou předponou, která se má přidat, a příponou, která se přidá ke skutečným dokončením. V následujícím příkladu je předpona a přípona definována pro list_job_attrib.sh,
$ jobs [1]+ Stopped cat $ complete -P '">' -S '<"' ./list_job_attrib.sh $ ./list_job_attrib.sh [TAB][TAB] $ ./list_job_attrib.sh ">cat<"
7. Dokončení názvu souboru a adresáře s vyloučením
Vezměte v úvahu, že skript dokončí svůj běh, výstup se zapíše do výstupního adresáře následovně
$ cd output/ $ ls all_calls.txt incoming_calls.txt outgoing_calls.txt missed_calls.txt parser_mod.tmp extract.o
Pokud ve výše uvedeném případě potřebujete ignorovat soubory .tmp a .o pro automatické dokončování pomocí příkazu ls,
$ export FIGNORE='.tmp:.o' $ complete -f -d ls $ cd output $ ls [TAB][TAB] all_calls.txt incoming_calls.txt outgoing_calls.txt missed_calls.txt
FIGNORE je proměnná shellu, která obsahuje příponu názvů souborů a ty jsou při automatickém dokončování vyloučeny.
8. Rozdělte řetězec pomocí IFS, abyste získali hodnoty dokončení
Seznam slov lze zmínit pomocí volby -W a ta se rozdělí s hodnotou v proměnné IFS. Potom se každé výsledné slovo rozbalí a zobrazí se pro dokončení,
$ export IFS=" " $ complete -W "bubble quick" ./sort_numbers.sh $ ./sort_numbers.sh [TAB][TAB] bubble quick
Jak je uvedeno výše, po rozdělení řetězce pomocí IFS delimetru se slovo rozšíří, takže je také možné mít tyto jako proměnné, jak je uvedeno níže,
$ echo $SORT_TYPE1 bubble $ echo $SORT_TYPE2 quick $ complete -W "$SORT_TYPE1 $SORT_TYPE2" ./sort_numbers.sh $ ./sort_numbers.sh [TAB][TAB] bubble quick
9. Napište svou vlastní funkci pro generování dokončení
Umožňuje zahrnout funkci pro definování dokončení. S volbou -F je název funkce předán do dokončení příkazu a ten se provede za účelem generování dokončení. Funkce je například napsána tak, jak je uvedeno níže,
_parser_options() { local curr_arg; curr_arg=${COMP_WORDS[COMP_CWORD]} COMPREPLY=( $(compgen -W '-i --incoming -o --outgoing -m --missed' -- $curr_arg ) ); }
kde ve výše uvedené funkci,
- COMPREPLY :pole obsahuje výsledky dokončení, které se zobrazí po stisknutí [TAB][TAB]
- COMP_WORDS :pole slov zadávaných na příkazovém řádku
- COMP_CWORD :index pro pole COMP_WORDS a pomocí těchto slov na různých pozicích na příkazovém řádku lze získat přístup.
- compgen :-W obsahuje možná dokončení a příslušný argument se vybere na základě $current_arg
Tato funkce přítomná v souboru parser_option získává zdroj, jak je ukázáno níže,
$ source parser_option
Propojte tuto funkci se skriptem analyzátoru, jak je uvedeno níže,
$ complete -F _parser_options ./parser.pl $ ./parser.pl [TAB][TAB] -i --incoming -o --outgoing -m --missed
Jak je vidět výše, možnosti pro analyzátory jsou generovány funkcí _parser_options().
Poznámka:Podívejte se na /etc/bash_completion pro zobrazení dalších funkcí pro programovatelné dokončení.
10. Sekundární specifikace, když primární negeneruje žádné
Pokud definovaná specifikace dokončení nevygeneruje žádné shody, pak se za dokončení uvedené s volbou -o použije comp-option.
$ complete -F _count_files -o dirnames ./countfiles.sh
Jak je uvedeno výše, dokončení je definováno funkcí _count_files pro soubor ./countfiles.sh. Pokud funkce _count_files() nevygeneruje žádnou shodu, dojde k pokusu o dokončení adresáře.
$ ls countfiles.sh dir1/ dir2/ dir3/ $./countfiles.sh [TAB][TAB] dir1 dir2 dir3