Bash allows for programmable completion, to extend the “hit tab to complete what I started typing for me” functionality. (Programmable completion was added to Bash in 2.04 beta, so if you have a Bash older than that, it won’t work – use bash –version to find out). Here’s a quick guide to setting up bash-completion to make Bash even nicer to use.
Install bash-completion
Firstly, install bash-completion in your normal way. I use Arch Linux for my workstations these days, and there’s a package available, so zero effort involved:
[root@ruthenium davidp]# pacman -S bash-completion
Targets: bash-completion-20060301-6
Total Package Size: 0.1 MB
Proceed with upgrade? [Y/n]
:: Retrieving packages from extra...
bash-completion-20060301 [################] 100% 68K 79.5K/s 00:00:00
checking package integrity... done.
loading package data... done.
checking for file conflicts... done.
installing bash-completion... done.
If you’re using another distro, grab the sources or RPMs here and install in the normal way.
If you’re running under X, just opening a new terminal (xterm) generally won’t read .profile so you’ll have to manually source the new completion settings with “source /etc/bash_completion” or add a line to ~/.bashrc to do the same.
Command options auto-completion
Now, say you forget what options you can give grep. Type “grep –” and hit tab twice, and you’ll get the list of options you can pass:
[davidp@ruthenium:~]$ grep --
--after-context= --extended-regexp --mmap
--basic-regexp --file= --no-filename
--before-context= --files-with-matches --no-messages
--binary --files-without-match --null
--binary-files= --fixed-strings --null-data
--byte-offset --help --only-matching
--color --ignore-case --perl-regexp
--colour --include= --regexp=
--context= --invert-match --silent
--count --label= --unix-byte-offsets
--devices= --line-buffered --version
--directories= --line-number --with-filename
--exclude-from= --line-regexp --word-regexp
--exclude= --max-count=
[davidp@ruthenium:~]$ grep --
Here’s a nice animated example:
Finding out what commands you can use with Subversion?
[davidp@ruthenium:~]$ svn
? cleanup diff log pe propedit rename switch
add co export ls pedit propget resolved unlock
ann commit h merge pg proplist revert up
annotate copy help mkdir pget propset rm update
blame cp import move pl ps st
cat del info mv plist pset stat
checkout delete list pd praise remove status
ci di lock pdel propdel ren sw
[davidp@ruthenium:~]$ svn
Notice that it shows you the options, then gives you your prompt back with what you already typed intact, so you can just carry on typing now you know what to type :)
It’ll complete the commands for you too, so if you type “svn ch” and tab, you’ll
get “svn checkout” filled in for you (although that’s a lame example, as if you
wanted to be lazy you’d just use “svn co” (shorthand for checkout)).
SSH hostname auto-completion
A very, very useful completion is the ssh completion – it uses your known_hosts file to auto-complete hostnames, so you can type the first couple of characters of a hostname and tab to complete it. Very natty indeed. :)
Incremental history search
Another little-used facility of Bash is the ability to search your previous command istory for a command to rerun. Just hit Ctrl+r and start typing, and it’ll display whatever matches. Ctrl+r again will select other matching commands, and enter will un it again.
I tried out bash-completion after reading a blog post on linuxhelp.blogspot.com.
There’s plenty more useful information about working productively with Bash on http://www.caliban.org/bash/ too.
Nice article – not often you see animations the command line in action :)
It’s nice, maybe add a little about aliases, i think they’d tie in nicely.
真是太喜欢了!
very good!
Big ThankX!
from a ArchLinux newbie!
Never saw an animated bash — fine.
Greetings from germany