Bash completion for commands in Mac OS X

35,955

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.

Share:
35,955

Related videos on Youtube

Osama Gamal
Author by

Osama Gamal

Updated on September 18, 2022

Comments

  • Osama Gamal
    Osama Gamal over 1 year

    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!

  • HikeMike
    HikeMike almost 13 years
    MacPorts' bash-completion package provides support for completion of package names as additional arguments after port <verb>. See here, lines 48-58. This behavior is hinted at in the MacPorts wiki, which states: "This is not just for files and directories, but also e.g. for the commands of port. So you type port <Tab> and get a list of all possible commands.", although it only explicitly mentions completion of the verbs (which is much simpler).
  • HikeMike
    HikeMike almost 13 years
    The package names are autocompleted, the wiki just doesn't mention that. See the linked script code.
  • user3540003
    user3540003 almost 13 years
    The variants.conf is not for completion for MacPorts itself; variants.conf defines variants to automatically set for all ports, as is explained on the wiki page you linked. Adding that line causes bash completion support to be enabled when possible for ports you install.
  • MrT
    MrT almost 13 years
    Thanks for the tip about autocompletion in homebrew. That alone earned this answer an up-vote.
  • Matthew Turner
    Matthew Turner over 10 years
    Excellent, this enabled make autocomplete, just what I wanted.
  • Marlon
    Marlon over 8 years
    if you happen to have both Brew and MacPorts make sure to add the macports one before Brew as it checks for $BASH_COMPLETION_COMPAT_DIR and exits if populated.
  • WestCoastProjects
    WestCoastProjects almost 5 years
    excellent instructions here!
  • SRG
    SRG over 2 years
    Thanks for the answer, @slhck! I still wanted auto-complete for Git and I found a good solution here macinstruct.com/tutorials/…