Bash $PATH filtering
How to filter things out of bash completion

As most modern GNU+Linux distro users already know, you get a lot of tools included for free! Many of these may clutter up your $PATH and make bash tab completion more difficult than it has to be. Here’s a way to improve this!

A mess:

Here’s what I see when I tab-complete cd<TAB>:

james@computer:~$ cd
cd                 cddb_query         cd-info            cd-read
cd-convert         cd-drive           cd-it8             cdrecord
cd-create-profile  cd-fix-profile     cdmkdir            cdtmpmkdir
cdda-player        cd-iccdump         cd-paranoia

I genuinely only use three of those commands.

let's make some tab completions more complete

Bash to the rescue:

It turns out the bash authors already thought of this. There’s an EXECIGNORE variable that you can set, and it will filter things out. Look what happens when you set it:

james@computer:~$ EXECIGNORE='*/py*:*/cd*'
james@computer:~$ cd
cd          cdmkdir     cdtmpmkdir

I rarely use any python things (and this is only an example) and I actually don’t need any of those cd* commands in my $PATH. Pass in a colon separated list of patterns to ignore, and magically things just work!

If you include this variable in your ~/.bashrc then it will load automatically every time you open a new terminal.

Which cd commands are those?

If you noticed the cdmkdir and cdtmpmkdir commands and wondered why they didn’t disappear, that’s because they’re mine!

james@computer:~$ which cdmkdir
cdmkdir ()
    mkdir "$@" && cd "${@: -1}"
james@computer:~$ which cdtmpmkdir
cdtmpmkdir ()
    cd `mktemp --tmpdir -d tmp.XXX`


From the manual:

A colon-separated list of shell patterns (see Pattern Matching) defining the list of filenames to be ignored by command search using PATH. Files whose full pathnames match one of these patterns are not considered executable files for the purposes of completion and command execution via PATH lookup. This does not affect the behavior of the [, test, and [[ commands. Full pathnames in the command hash table are not subject to EXECIGNORE. Use this variable to ignore shared library files that have the executable bit set, but are not executable files. The pattern matching honors the setting of the extglob shell option.


I hope that makes your bash tab completion filtering easier!

Happy Hacking,


You can follow James on Mastodon for more frequent updates and other random thoughts.
You can follow James on Twitter for more frequent updates and other random thoughts.
You can support James on GitHub if you'd like to help sustain this kind of content.
You can support James on Patreon if you'd like to help sustain this kind of content.

March 2, 2024
414 words

bash execignore fedora filter linux path planetfedora




Nothing yet.

Post a comment

(sorry but the spammers were getting too crazy!)

Thank you

Your comment has been submitted and will be published if it gets approved.

Click here to see the patch you generated.