bash_completion 找不到函数

bash_completion 找不到函数

我编写了一个程序 (logit),用于设置日志记录并在命令行上执行其后的内容。一切正常。

我希望能够完成命令,sudo 的工作方式与 logit 类似,所以为了偷懒,我在 .bashrc 中执行以下操作:

complete -F _sudo logit

当它工作时,它满足我的需要,但是直到我将它用于 sudo 之后,我才能使用 logit 的完成。

wwalker@polonium:~$ type _sudo
-bash: type: _sudo: not found                                                 
wwalker@polonium:~$ logit cal-bash: completion: function `_sudo' not found
wwalker@polonium:~$ logit cal-bash: completion: function `_sudo' not found
wwalker@polonium:~$ sudo cal                                                  
cal                 caller              callgrind_annotate  callgrind_control    
wwalker@polonium:~$ type _sudo                                                
_sudo is a function            
_sudo ()           
{          
....
wwalker@polonium:~$ logit cal
cal                 caller              callgrind_annotate  callgrind_control   
wwalker@polonium:~$ logit cal

有人知道 _sudo 是如何神奇地出现的吗?

谢谢韦恩

编辑:我发现/usr/share/bash-completion/completions/sudo当我尝试自动完成 sudo 命令时,某些东西会触发延迟加载。在执行自动完成时查看 set -x,我发现它调用了__load_completion sudo

因此我有一个解决方法,将其放入我的.bashrc中:

__load_completion sudo
complete -F _sudo logit

编辑2:

wwalker@polonium:~$ ls -li /usr/share/bash-completion/completions/sudo*
3017247 -rw-r--r-- 1 root root 1306 2017-09-22 00:25:24.000 /usr/share/bash-completion/completions/sudo
3017249 lrwxrwxrwx 1 root root    4 2019-01-31 08:28:33.000 /usr/share/bash-completion/completions/sudoedit -> sudo

为了按我想要的方式作弊,我可以这样做:

ln -s /usr/share/bash-completion/completions/sudo /home/wwalker/.local/share/bash-completion/completions/logit

并将最后一行编辑为:

complete -F _sudo sudo sudoedit logit

答案1

我尝试了一种偷懒的解决方案,但问题就出在这里。在努力提出一个包含必要细节的好问题时,我最终发现了自己的错误,并且……

正确的做法是:

cp /usr/share/bash-completion/completions/sudo /home/wwalker/.local/share/bash-completion/completions/logit

然后编辑新logit文件并使其自定义为我的程序。将函数名称和其他引用从 sudo 更改为 logit。

相关内容