For this explanation assume your new command is named sc
,
and sc
is on your path. We’ll also assume you are
replicating the completion of an existing command named
systemctl
.
Reference:
This presumes you’ve installed bash-completion
.
pkg-config bash-completion --variable compatdir
# On my machine (2023-05-18) that is
/etc/bash_completion.d
systemctl
has a custom completion script.$ complete -p systemctl
There are two categories of output from complete -p <cmd>
The
first tells us the obvious, that there is nothing special about
systemctl
, and it is completed with bash’s default completion.
bash: complete: systemctl: no completion specification
If this happens check to see if bash_completion is being sourced.
The second category of output looks like this:
$ complete -p systemctl
complete -F _systemctl systemctl
This tells us that bash uses a function named _systemctl
when
completing the command systemctl
.
_systemctl
function.I could tell you a lot about find
and grep
, but that would
just waste your time with learning. Instead, just look in
/etc/share/bash_completion/completions
. There I see a file
systemctl
, and inside it the function _systemctl
is defined.
/etc/bash_completion.d/
.cat > /etc/bash_completion.d/sc << EndOfFile
#! /usr/bin/env dash
# completion for sc
source /usr/share/bash-completion/completions/systemctl
complete -F _systemctl sc
EndOfFile
You may have to source your new completion file before testing.