DESCRIPTION Bash allows completion to come from various sources. The simplest is from a list of words (-W): % complete -W "one two three four" somecmd % somecmd t two three Another source is from a bash function (-F). The function will receive input in two variables: COMP_WORDS (array, command-line chopped into words) and COMP_CWORD (integer, index to the array of words indicating the cursor position). It must set an array variable COMPREPLY that contains the list of possible completion: % _foo() { local cur COMPREPLY=() cur=${COMP_WORDS[COMP_CWORD]} COMPREPLY=($( compgen -W '--help --verbose --version' -- $cur ) ) } % complete -F _foo foo % foo --help --verbose --version And yet another source is an external command (including, a Perl script). The command receives two environment variables: COMP_LINE (string, raw command-line) and COMP_POINT (integer, cursor location). Program must split COMP_LINE into words, find the word to be completed, complete that, and return the list of words one per-line to STDOUT. An example: % cat foo-complete #!/usr/bin/perl use Complete::Bash qw(parse_cmdline format_completion); use Complete::Util qw(complete_array_elem); my ($words, $cword) = @{ parse_cmdline() }; my $res = complete_array_elem(array=>[qw/--help --verbose --version/], word=>$words->[$cword]); print format_completion($res); % complete -C foo-complete foo % foo --v --verbose --version This module provides routines for you to be doing the above. SEE ALSO (2) Other modules related to bash shell tab completion: Bash::Completion, Getopt::Complete. Term::Bash::Completion::Generator Programmable Completion section in Bash manual: https://www.gnu.org/software/bash/manual/html_node/Programmable-Complet ion.html