Commandline Tips: TAB-Completion
- April 8, 2015
- 0
Tab-completion is één van die onmisbare features om efficiënt te werken met de shell. Automatisch aanvullen van bestands- of mapnamen is het bekendste voorbeeld, maar tab-completion doet meer dan dat!
1. Bestanden
Werk je vaak met lange of moeilijke bestandsnamen? Dan weet je wellicht dat het volstaat om een deel van die naam in te voeren en op tab te drukken. Is er slechts één bestand of map die met die tekst begint, dan vult bash de naam automatisch aan. Zijn er meerdere mogelijkheden, dan vult bash de tekst zo ver mogelijk aan. Druk dan nogmaals op tab voor een overzicht van de verschillende mogelijkheden. Meestal volstaat het daarna om enkele extra letters in te voeren en op tab te drukken om de volledige naam te krijgen.
2. Mappen
Ook voor mapnamen werkt tab-completion zoals beschreven in tip 1 hierboven. Meer nog: bash is slim genoeg om bij tab-completion na het cd-commando uitsluitend mapnamen voor te stellen. Bash bevat trouwens verschillende opties om het werken met mappen te vereenvoudigen. Die opties stel je in met shopt -s <optienaam> in je shell (tijdelijk) of in ~/.bashrc (permanent). Met de autocd-optie mag je het cd-commando weglaten om naar een andere map te navigeren. De optie cdspell verbetert kleine spelfouten in mapnamen bij het cd-commando. Zo zal bash je zonder morren naar de directory Downloads brengen als je per ongeluk “Donwloads” of “downloads” invoert.
3. Commando’s
Commando’s uit één van de directories van de $PATH-variabele worden ook aangevuld door tab-completion. Maar soms probeer je een commando uit te voeren dat niet geïnstalleerd is op je systeem. Je kan dan in je package manager op zoek gaan naar het juiste pakket, maar waarom laat je dat niet over aan de shell? Installeer gewoon het pakket ‘command-not-found’ en bash zoekt voor jou op welk pakket het commando in kwestie bevat. Net zoals de cdspell-optie, herkent command-not-found zelfs kleine spelfouten.
4. $CDPATH
Zou het niet handig zijn als je in de shell onmiddellijk naar je meestgebruikte mappen kan navigeren, ongeacht waar die zich bevinden? Dat kan met de $CDPATH-variabele. $CDPATH is vergelijkbaar met het bekende $PATH, maar werkt voor directories in plaats van commando’s. Neem zeker de huidige directory (.) als eerste element van $CDPATH op, want anders kan je onmogelijk naar bepaalde directories navigeren als er elders in je $CDPATH gelijknamige directories bestaan (zie listing 1)! Het export CDPATH-commando plaats je uiteraard in ~/.bashrc als je $CDPATH permanent wilt gebruiken.
~$ export CDPATH=~/Documenten
~$ cd Downloads
/home/filip/Documenten/Downloads
~/Documenten/Downloads$ cd
~$ export CDPATH=.:~/Documenten
~$ cd Downloads
/home/filip/Downloads
~/Downloads$ export CDPATH=.:~/Documenten:~/Documenten/Werk/Freelance\ journalist/Artikels
~/Downloads$ cd 2013
/home/filip/Documenten/Werk/Freelance journalist/Artikels/2013
~/Documenten/Werk/Freelance journalist/Artikels/2012$
5. Hostnames
Met uitzondering van tip 3 behoren de vorige tips allemaal tot de basisfunctionaliteit van bash. Je krijgt echter nog heel wat meer mogelijkheden als je het pakket ‘bash-completion’ installeert en daarna het bestand /etc/bash_completion in je ~/.bashrc inleest. Een leuke extra is bijvoorbeeld het aanvullen van hostnames op basis van /etc/hosts voor een groot aantal netwerkcommando’s. Probeer maar eens ping <tab> <tab> om te zien welke hostnames op jouw systeem bekend zijn.
6. Ssh
Erg handig is ook het aanvullen van bestandsnamen op remote servers in scp-commando’s. Dat werkt natuurlijk pas goed als bash bliksemsnel een ssh-verbinding kan opzetten. Gebruik daarom publickey-authentication en zorg ervoor dat je private key via de ssh-agent steeds beschikbaar is. Schakel ook multiplexing in om meerdere ssh-sessies naar dezelfde server over één verbinding te sturen. Zo merk je nauwelijks vertraging bij remote tab completion. Met de configuratie uit onderstaande listing bijvoorbeeld activeer je multiplexing met een idle timeout van 5 minuten. De ssh-verbinding blijft dan op de achtergrond open voor volgende tab completions.
$ cat ~/.ssh/config
Host *
ControlMaster auto
ControlPath ~/.ssh/%r@%h:%p
ControlPersist 5m
7. Argumenten
Tot slot vult bash-completion ook argumenten van commando’s aan, al moeten de pakketbeheerders daarvoor een configuratiebestand voorzien onder /etc/bash_completion.d. Druk gewoon op tab na de commandonaam voor een overzicht van alle beschikbare argumenten. Dat werkt onder andere bij apt-get, aptitude en git (de verschillende subcommando’s), service (de beschikbare services onder /etc/init.d) of Apache’s a2enmod/a2dismod en a2ensite/a2dissite (de beschikbare modules en websites).