我正在尝试为我编写的实用程序脚本设置bash完成,所以我将以下脚本添加到/etc/bash_completion.d中:
_mcd()
{
local cur words
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
words=`mcd-completion-words`
COMPREPLY=( $(compgen -W "${words}" -- "$cur") )
return 0
}
complete -F _mcd mcd
mcd-completion-words
脚本以编程方式查找命令的可用运算符。当我重新启动bash(或源脚本)时,我可以成功完成选项卡,但是如果我这样做,我就不能再通过已完成的角色退格。
另外,如果我尝试列出所有选项(例如我尝试选项卡完成没有任何单词),bash会在命令中添加一个选项卡,我也无法退格。
如何使bash模仿正常的文件完成行为?任何帮助表示赞赏。谢谢!
这是一个简化的mcd-completion-words测试用例,它仍然表现出相同的行为。奇怪的是,丹尼斯的案例也适用于我(例如,当用词=“一二三”代替时)。
#!/usr/bin/env php
<?php
print "one two three four five six seven eight nine";
答案 0 :(得分:1)
这是一个简化的测试用例;即使是空的`php'命令也会导致错误的完成行为:
$ _mcd() { php -r ""; COMPREPLY=( one ); }
$ complete -F _mcd mcd
$ mcd <TAB> # Becomes 'mcd one' all right
$ mcd one <BACKSPACE> # ERROR: doesn't work
这是在机器(Ubuntu)上同时使用bash-3.2.48 / bash-4.0.33&amp; PHP-5.2.6-3ubuntu4。在另一台机器(Debian)上使用bash-3.2.39&amp; php-5.2.6-1 + lenny9,完成&amp;退格没事。
使用perl -e ""
代替php -r ""
也可以。
不知道发生了什么,php与readline冲突?也许你可以试试bug-bash邮件列表?