我编写了一个程序 (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。