在linux下make make的破坏标签完成

Cip*_*agă 8 linux bash makefile tab-completion

我不知道标签完成是如何工作的,但突然之间我的一切都被破坏了.除了用例之外,我甚至不知道提供什么信息.cleanmakefile中有一个目标.

$ make c<tab> 结果是

$ make c23:set: command not found lean

编辑: 我相信某种程度上我破坏了set内置的bash,因为它man setNo manual entry for set并且which set没有任何报告.但是,在终端上调用set会产生结果.

我正在使用:GNU bash,版本4.3.11(1)-release(x86_64-pc-linux-gnu)GNU Make 3.81

Cip*_*agă 14

感谢Etan的评论和Aaron指示makefile的位置,我设法调试了这个.

我跑了,set -x所以我可以跟踪完成标签时发生的事情.输出make c<tab>主要包括来自bash完成文件的命令make,位于/usr/share/bash-completion/completions/make(1).但是,我注意到输出和文件之间的不一致.接近尾声,产量说:

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

我从文件中确定了与这些行对应的内容:

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

local reset=$( set +o | grep -F posix ); set +o posix # for <(...)
Run Code Online (Sandbox Code Playgroud)

所以输出做了一个grep --colour=auto -n而不仅仅是grep.的确,我已经设置了这个别名grep

删除别名后立即生效.

我希望这有助于其他人调试他们的问题.

编辑:我在这里提交了一个错误报告:https://alioth.debian.org/tracker/index.php?func = detail&aid = 315108&group_id = 100114 &atid = 413095

  • 这不是一个差不多的错误吗?我的意思是这个脚本应该使用/ usr/bin/grep而不是依赖潜在的用户别名?无论如何,谢谢你的解决方案,我在我的bashrc文件中也有相同的别名. (6认同)
  • 这对我来说似乎是个错误,有人应该报告.我认为为grep添加颜色也是一个常见的别名...这是一个单字符修复,只需在scrirpt中使用`\ grep`.我把它添加到我的`/ usr/share/bash-completion/completions/make`中并修复了它.我能分开赏金吗?一半应该去@ etan-reisner一半去@ ciprian-tomoiaga. (4认同)
  • 实际上,被用户别名打破是这个完成脚本中一个有点严重的缺陷.它应该使用各种各样的东西来防止这种情况发生. (2认同)
  • 这肯定是一个错误,应该报告.但颜色不是问题(自动不会触发那里)`-n`是. (2认同)