I am looking to get tab-completion on my command line aliases, for example, say I defined the following alias :

alias apt-inst='sudo aptitude install'

Is there a way to get the completions provided by aptitude when I hit the tab key? i.e. when I write 'sudo aptitude install gnumer' and hit tab, aptitude completes this to gnumeric, or if there was uncertainty lists all the available packages starting with gnumer. If I do it using my alias, nothing - no completion.


There is a great thread about this on the Ubuntu forums. Ole J proposes the following alias completion definition function:

function make-completion-wrapper () {
  local function_name="$2"
  local arg_count=$(($#-3))
  local comp_function_name="$1"
  shift 2
  local function="
    function $function_name {
      COMP_WORDS=( "$@" \${COMP_WORDS[@]:1} )
      return 0
  eval "$function"
  echo $function_name
  echo "$function"

Use it to define a completion function for your alias, then specify that function as a completer for the alias:

make-completion-wrapper _apt_get _apt_get_install apt-get install
complete -F _apt_get_install apt-inst

I prefer to use aliases for adding always-used arguments to existing programs. For instance, with grep, I always want to skip devices and binary files, so I make an alias for grep. For adding new commands such as grepbin, I use a shell script in my ~/bin folder. If that folder is in your path, it will get autocompleted.

| improve this answer | |
  • 2
    Awesome, I was afraid it wouldn't be possible. – levesque Nov 20 '10 at 17:10
  • Note this code has some issues. See my answer for their explanation and resolution. – Tom Hale Sep 15 '16 at 13:06
  • Note: I was using this technique for another command, and I had to use complete -o default -F ... instead of complete -F ... to get things like filename auto-completion working correctly when passing args (Bash 4.3.46). – joelittlejohn Dec 19 '16 at 14:39
  • I am struggling to get this working for kubectl. Here is what I am trying: alias ks=kubectl\ --context=staging; make-completion-wrapper __start_kubectl _ks kubectl --context=staging; ` complete -F _ks ks; when I type ks g` it correctly completes to ks get but then when i type ks get p I don't get expected completions like 'pods`. Am I doing something wrong? – kortina May 8 at 23:07
  • [update]: I think the underlying problem for me is w kubectl, not the alias... kubectl get p also does not complete as expected. – kortina May 8 at 23:24

Try complete-alias, which solves this problem exactly. (Disclaimer: I am the author of complete_alias)

After install it you can use one generic function to complete many aliases like this:

complete -F _complete_alias <myalias1>
complete -F _complete_alias <myalias2>
complete -F _complete_alias <myalias3>

You may want to source the complete_alias file in every bash instance through .bash_profile or similar.


mkdir ~/.bash_completion.d
curl https://raw.githubusercontent.com/cykerway/complete-alias/master/complete_alias \
     > ~/.bash_completion.d/complete_alias


source ~/.bash_completion.d/complete_alias

alias container=docker\ container
complete -F _complete_alias container

container can now be autocompleted by the original _docker() completion handler;

$ container l<Tab>
logs  ls    

$ container s<Tab>
start  stats  stop   
| improve this answer | |
  • 2
    Given that this software seems to be yours, you could do better than this. Add instructions on installing it. Describe what it does and how to use it. Otherwise this is just spam. – muru Dec 24 '16 at 7:55
  • @muru I was thinking of pasting some code here but it's probably longer than accepted here. I'd assume people have no problem reading the Install section in a README file, and in this case it's only several lines. – Cyker Dec 25 '16 at 12:12
  • 2
    the point is to be able to judge whether visiting said README is worthwhile, just from the answer. – muru Dec 25 '16 at 12:14
  • 1
    This is an adequate answer and it solves the problem exactly. – Ярослав Рахматуллин Oct 10 '18 at 23:16
  • 3
    This is an excellent and very comprehensive answer that works perfectly, thanks!. It's probably been updated since @muru had problems with it. – Brian Topping Oct 19 '18 at 20:21

2018 answer

You must add your alias to the program 'complete'. Depending the kind of autocompletion you want to achieve, you must use -c or -F.

For package autocompletion:

complete -c name_of_your_alias

For command autocompletion:

complete -F name_of_your_alias

To check if your alias was added correctly:

complete | grep name_of_your_alias

Finally, to remove an alias from 'complete':

complete -r name_of_your_alias

In your case:

complete -c apt-inst
| improve this answer | |
  • 1
    Please don’t continue your answer in comments. If you have things to say, edit them into the answer. – G-Man Says 'Reinstate Monica' May 21 '18 at 3:02
  • 5
    complete -F xxx does not work on OSX (It just shows the usage complete: usage: complete [-abcdefgjksuv] [-pr] [-o option] [-A action] [-G globpat] [-W wordlist] [-P prefix] [-S suffix] [-X filterpat] [-F function] [-C command] [name ...]) . Do you have any pointer? Thanks. – Anthony Kong Feb 28 '19 at 22:20
  • 2
    Use this instead: unix.stackexchange.com/questions/224227/… – Rich Jun 5 '19 at 8:20

By googling this issue I ended up here, so I tried the approaches in the other answers. For various reasons I don't actually understand, they never behaved properly in my Ubuntu 16.04.

What in the end worked for me was way more trivial than expected. I wanted to use the same autocompletion as rsync has for mycommand. Hence, I looked up the autocompletion function, and then called complete accordingly.

# Lookup of name of autocompletion function used for rsync
complete -p rsync
# Returns: complete -o nospace -F _rsync rsync

# Sourcing the rsync functions before, then using the same function for 'mycommand'
. /usr/share/bash-completion/completions/rsync
complete -o nospace -F _rsync mycommand

Disclaimer: I'm not sure what's the downside of my approach compared to the others. I mainly wrote this as it could help people where this trivial approach might be enough.

| improve this answer | |
  • It seems that bash says bash: complete: XYZ: no completion specification until you actually try to complete with XYZ the first time. I think editing the user .bash_completion file is the way to go, though I'm still not sure how... – Myridium May 17 at 22:50
  • Turns out that the way to do this is call _completion_loader rsync first, to make sure the completion function is loaded. It is sometimes (always?) loaded only when you try to autocomplete with the function for the first time. This answer also has another problem: it cannot autocomplete with the context of arguments provided. E.g. it cannot make an alias for pass -c autocomplete like pass -c, only like pass. These are different. – Myridium Jun 30 at 8:10

Here's the code from Shawn J. Goff's answer with some improvements:

  • Fixed syntax errors highlighted by shell-check, eg the first " of "$@" actually ended the function definition string.
  • Removed the return 0 so that the return value of the underlying function can be passed back to the caller.


# Wraps a completion function, eg for use with an alias.
# Usage:
# make-completion-wrapper <actual completion function> <name of new func.>
#                         <command name> <list supplied arguments>
# eg.
#   alias agi='apt-get install'
#   make-completion-wrapper _apt_get _apt_get_install apt-get install
#     # defines a function called _apt_get_install (that's $2) that will
#     # complete the 'agi' alias. 
#   complete -F _apt_get_install agi
function make-completion-wrapper {
  local function_name="$2"
  local arg_count=$(( $#-3 ))
  local comp_function_name="$1"
  shift 2
  local function="function $function_name {
      (( COMP_CWORD += $arg_count ))
      COMP_WORDS=( \"\$@\" \${COMP_WORDS[@]:1} )
  eval "$function"
  # echo "$function"
export -f make-completion-wrapper
| improve this answer | |
  • Doesn't work for me in Bash 4.3.46 I'm afraid. Shaun J. Goff's answer does work. – joelittlejohn Dec 19 '16 at 14:38
  • 1
    "Ending" the function definition string is on purpose; the point is to include arguments from the outer function into the COMP_WORDS array. If we use make-completion-wrapper _apt_get _apt_get_install apt-get install as an example, after shift 2, $@ contains apt-get install. The function definition includes apt-get install (the two literal words) when assigning COMP_WORDS. – Jeffery To Jun 3 '19 at 19:58

As an extension to @Giles answer, the following convenience function auto-names the wrapper generated by make-completion-wrapper to make it possible to define completion in one line:

function complete-alias  {
    # uses make-completion-wrapper: https://unix.stackexchange.com/a/4220/50978
    # example usage
    # complete-alias _pass pshow pass show
    # complete-alias _pass pgen pass generate

    EXISTING_COMPLETION_FN=${1} && shift
    ALIAS=${1} && shift
    make-completion-wrapper ${EXISTING_COMPLETION_FN} ${AUTOGEN_COMPLETION_FN} ${*}
| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.