How does TAB auto-complete find options to complete?
Depending on the command:
- Someone may have written a function to generate possible completions of arguments, including options. You'll find functions for some commands in
/etc/bash_completion.d/*
(or a different location on some systems). These functions are registered with thecomplete
built-in (e.g.complete -F _find find
tells bash to call the_find
function when you press Tab on afind
command). They use thecompgen
built-in to tell bash “here are the possible completions”. - For some commands, bash will call the command with the argument
--help
and parse the output. Such commands can be registered with thecomplete
built-in, e.g.complete -F _longopt ls
._longopt
is in fact a completion generation function, that happens to parse a command's output rather than use a fixed list. (There are other more specialized completion functions that parse a command's output to generate possible completions; look in/etc/bash_completion.d/*
for examples.) - For things like aliases, the completion function looks them up in bash's internal tables. The
complete
built-in has options for that, e.g.-A
for aliases.
Have a look at the file
/etc/bash_completion
and observe the files from the directory:
/etc/bash_completion.d
You will find the answer.
Support for bash completion is provided in Debian and Ubuntu by the bash completion package. You also usually need to uncomment the following in /etc/bash.bashrc
and/or .bashrc
to source the bash completion files. The following is from /etc/bash.bashrc
:
# enable bash completion in interactive shells
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
. /etc/bash_completion
fi
for this to work. I usually uncomment it in both. The handling of interactive/login shells in Debian is a bit of a mess.
Similar comments presumably apply to other distributions, though maybe they enable the sourcing by default.