Linux下make命令的选项补全失效了。

8
我不知道如何使用选项卡自动完成,但突然间我的自动完成功能失效了。除了用例外,我甚至不知道要提供什么信息。 在makefile中有一个目标clean
输入$ make c<tab>结果为 $ make c23:set: command not found lean 编辑: 我认为某种方式我破坏了bash内置的set,因为man set显示No manual entry for set而且which set没有报告任何内容。然而,在终端上调用set会产生结果。
我正在使用:GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)GNU Make 3.81

没有关于setman 手册页。请尝试运行help sethelp 是一个内置的 BASH 命令)或者 man bash 或者 info bash - Aaron Digulla
type setcommand set 在 shell 中返回什么?如果您运行 set -x 然后触发此问题,会得到什么? - Etan Reisner
type set说它是一个bash内建命令。command set会显示所有我的环境变量和大量的bash函数。set -x会生成以下错误信息:+ 23:set +o posix bash: 23:set: 命令未找到。 - user1794469
@user1794469,我的问题与别名有关。尝试删除你的别名,看看问题是否仍然存在。 - Ciprian Tomoiagă
我指的是 command -V set,抱歉。尽管在这里给出的解决方案也不会有所帮助。 - Etan Reisner
显示剩余2条评论
3个回答

14

多亏了Etan的评论以及Aaron指出makefile位置,我成功地调试了它。

我运行了set -x命令,以便在执行tab补全时跟踪发生的情况。命令make c<tab>的输出主要是来自于/usr/share/bash-completion/completions/make(1)中的bash补全文件。然而,我注意到输出和文件之间存在不一致性。到最后,输出说:

+ local mode=--
+ ((  COMP_TYPE != 9  ))
++ set +o
++ grep --colour=auto -n -F posix
+ local 'reset=23:set +o posix'
+ set +o posix
我确认这对应于文件中的这些行:
if (( COMP_TYPE != 9 )); then
    mode=-d # display-only mode
fi

local reset=$( set +o | grep -F posix ); set +o posix # for <(...)
因此输出执行了grep --colour=auto -n而不是仅仅的grep。确实,我已经为grep设置了这个别名。
一旦我删除了别名,Make就可以正常工作了。
我希望这能帮助其他人调试他们的问题。
编辑:我在这里提交了一个错误报告:https://alioth.debian.org/tracker/index.php?func=detail&aid=315108&group_id=100114&atid=413095

6
这几乎算是一个 bug 吗?我是说这个脚本应该使用 /usr/bin/grep 而不是依赖潜在用户别名吧?无论如何感谢解决方案,我的 bashrc 文件中也有同样的别名。 - claf
2
事实上,被用户别名破坏是这个自动完成脚本中相当严重的缺陷。它应该使用各种方法来防止这种情况发生。 - Etan Reisner
4
对我来说,这似乎是一个 bug,有人应该报告它。 我认为为 grep 添加颜色也是一个常见的别名…只需在脚本中简单地使用 \grep 进行一字符修复即可。 我将其添加到了我的 /usr/share/bash-completion/completions/make 中,然后问题就解决了。 我能分配赏金吗?一半应该归 @etan-reisner,另一半应该归 @ciprian-tomoiaga。 - user1794469
2
这肯定是一个 bug,应该报告一下。但颜色不是问题(自动触发器不会在那里触发),而是 -n 的问题。 - Etan Reisner
@user1794469 像我在帖子评论中所说的(我没有意识到其他人已经发布了悬赏),请接受并奖励这个答案。 - Etan Reisner

2
请查看 /etc/bash_completion/etc/bash_completion.d 和/或 /usr/share/bash-completion/completions。您应该会找到一个名为 make 的文件,其中包含在按下 Tab 键时调用的脚本。
使用您的Linux发行版的打包系统来验证该文件(或者可能还原到旧版本)。
另一个可能的原因是Makefile中的某些内容使BASH自动完成脚本解析器失去了方向感。

/etc/bash_completion.d/中没有make文件 :( 在/etc/bash_completion中也没有make条目的迹象... - Ciprian Tomoiagă
请按照以下建议操作:http://superuser.com/questions/142211/bash-completion-processing-gone-bad-how-to-debug - Aaron Digulla
抱歉再次提醒,但我仍然无法修复它。我已经忍受了几个月,但现在我真的需要它。此外,我不认为是Makefile的问题,因为即使使用最基本的Makefile也会出现这种情况。 还有,请问您能看到我的编辑吗?谢谢! - Ciprian Tomoiagă
1
make 的自动补全文件在目录 /usr/share/bash-completion/completions 中。 - Ebrahimi

1

我并不想得到任何荣誉,但最好的解决方案实际上隐藏在评论中...

请投票支持此评论,而不是我的答案!

修复此问题的简单步骤:

sudo vi /usr/share/bash-completion/completions/make

找到包含grep指令的那一行。它应该长这样:

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

在“grep”指令之前添加一个“\”:
local reset=$( set +o | \grep -F posix ); set +o posix # for <(...)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接