我编写了一个程序(logit),用于在命令行中设置日志记录和执行程序。一切都很好。
我希望能够完成命令,sudo就像logit一样工作,所以由于懒惰,我在我的.bashrc中这样做:
complete -F _sudo logit
当它工作,它做我需要的,但我不能使用完成的logit,直到我使用它的sudo。
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是怎么神奇地出现的吗?
谢谢韦恩
编辑:当我尝试自动完成sudo命令时,我发现某些东西会触发/usr/share/bash-completion/completions/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发布于 2019-09-14 08:05:21
我试图找到一个懒惰的解决方案就是问题所在。当我用需要的细节做一个很好的问题时,我发现了我的错误.
正确的方法是:
cp /usr/share/bash-completion/completions/sudo /home/wwalker/.local/share/bash-completion/completions/logit然后编辑新的logit文件并使其自定义为我的程序。几乎将函数名和其他引用从sudo更改为logit。
https://serverfault.com/questions/984207
复制相似问题