Like Bash and many other Linux tools, you can start typing a command into Emacs and press Tab to see if Emacs will complete it for you. Emacs may complete it, or it may add a few characters and then wait for input.
For example, if the command we want is ispell-comments-and-strings, we can type in isp and press Tab. Emacs fills it out to ispell and waits for more. We type in -co and press Tab. Emacs has several possibilities, so it gives us a list of completions. We type mm and press Tab, and Emacs does the rest for us.
You can also get a list of possible completions with ? or with a second Tab.
In Emacs, tab completion works for you in other ways. For example, when you visit a file, you can specify the filename with tab completion. In the Info menus, you can use tab completion to specify topics to visit.
Other programs use the GNU Project's C function readline() (man 3 readline) to handle tab completion for them. Bash, for instance, attempts completion, treating the text as a variable (if the text begins with $), username (if the text begins with ~), hostname (if the text begins with @) or command (including aliases and functions), in turn. If none of these produces a match, Bash tries filename completion. GDB allows completion of program functions and variables and only attempts filename completion under certain circumstances. vi also has tab completion for filenames and in its on-line help.
For user-friendly programs, you can use tab completion as well. The function readline() is available (directly, though wrappers or in a work-alike native function) to programmers using Java, Perl, Python, Guile and Tcl and no doubt other languages as well. readline() also has support for input history, similar to the history capabilities in Bash. It is easily customized via an rc file. The name and location of the file may be specified to the program via the environmental variable INPUTRC.