Bash completion for commands in Mac OS X

How do I get fink and macports to autocomplete program names when typing commands, as in Ubuntu's apt-get?

For example when I type

sudo port install ca

and press tab, I want the terminal to autocomplete or show me the available commands.

OS X does not even auto-complete commands after sudo!


Solution 1:

bash-completion adds completion for:

  • Command names after sudo and which
  • Macports and Homebrew package names (optional)
  • Hostnames in known_hosts for commands like ssh
  • Folders on CDPATH

And so on. You can print a list of completion commands with complete -p and see the source of a function with declare -f.

Installing Homebrew or MacPorts and Bash

First, you have to install Homebrew or MacPorts according to the instructions. Note: Do not install both, as they conflict.

Then, install a newer version of Bash. The built-in Bash in OS X is a little old, and you'll get more completion options with Bash > 4.1, which you can get through

brew install bash

or

sudo port install bash

depending on whether you use Homebrew or MacPorts.

Installing bash-completion with Homebrew

To install bash-completion, you have to:

brew install bash-completion

And add the following to your ~/.bash_profile:

if [ -f $(brew --prefix)/etc/bash_completion ]; then
  . $(brew --prefix)/etc/bash_completion
fi

Homebrew currently installs an older version of bash-completion (1.3) that still works with Bash 3.x, but still, using Bash 4.x is recommended.

Installing bash-completion with MacPorts

With MacPorts:

sudo port install bash-completion

Then, add to your ~/.bash_profile:

if [ -f /opt/local/etc/profile.d/bash_completion.sh ]; then
  . /opt/local/etc/profile.d/bash_completion.sh
fi

See trac.macports.org/wiki/howto/bash-completion for instructions on how to enable completion for port names.