Ciprian Tomoiaga Ciprian Tomoiaga - 5 months ago 37
Linux Question

Broken tab completion on make under linux

I have no idea how tab completion works, but all of a sudden mine is broken. I don't even know what info to provide other than the use case.
there is a target

in the makefile.

$ make c<tab>
results in

$ make c23:set: command not found

I believe somehow I ruined the
bash built-in since
man set
No manual entry for set
which set
doesn't report anything. Invoking set on the terminal, however, produces result.

I'm using: GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu) and GNU Make 3.81


thanks to Etan's comment and Aaron's indication of where makefiles are, I managed to debug this.

I ran set -x so I could track what was happening when doing the tab completion. The output of make c<tab> consists mostly of commands from the bash completion file for make, located at /usr/share/bash-completion/completions/make (1). However, I noticed the an inconsistency between the output and the file. Towards the end, the output said:

+ local mode=--
+ ((  COMP_TYPE != 9  ))
++ set +o
++ grep --colour=auto -n -F posix
+ local 'reset=23:set +o posix'
+ set +o posix

Which I identified as corresponding to these lines from the file:

if (( COMP_TYPE != 9 )); then
    mode=-d # display-only mode

local reset=$( set +o | grep -F posix ); set +o posix # for <(...)

So the output did a grep --colour=auto -n instead of just grep. Indeed, I had setup this alias for grep

Make worked as soon as I removed the alias.

I hope this helps others debug their problems.

EDIT: I have submitted a bug report here: