在 manjaro ( KDE )中,使用 sudo 时不能补全参数。例如输入 sudo systemctl res,此时按下 tab 键,出现的提示并不包括 restart 。使用 pacman 安装软件时也不能补全软件名。
但不加 sudo 就可以补全参数或软件名,普通用户和 root 用户均是如此。
(baidu 上查到过很多方法,但无一有效)
不过 debian 、ubuntu 和 centos 都没有这个问题……
请教高手, 这个问题怎么解决?
先行谢过
觉得这可能是它自带的终端模拟器的问题。你换一个终端模拟器看看?
换 zsh,用 ohmyzsh 有 sudo 的插件。
你用的什么 shell,这个应该是 shell 配置的问题
bash-completion 的问题…
假定你用的 zsh,看这篇贴子里用到了 zstyle,https://forums.gentoo.org/viewtopic-t-1053122-start-0.html
sudo pacman -S bash-completion
echo '. /usr/share/bash-completion/bash_completion' >> ~/.bashrc
在`~/.bashrc`或`/etc/bash.bashrc`中找到
```
complete -cf sudo
```
使其不生效(注释掉 /移除)
这跟 kde 和 manjaro 没什么关系,是 shell 配置错误
换 shell 比如 fish
换 zsh 吧,好看又好用
第二句在 /etc/bash.bashrc 里面有吧
换 powershell 吧,好看又好用
你这个方法是目前唯一有效的。问题是:为什么?我在.bashrc 中添加了一条 complete -cf man,然后 man 命令后面就可以自动补全了,之前是不行的,但现在注释掉 complete -cf sudo,反而 sudo 后面就能自动补全但之前不行呢?
bash,默认的。
换了个 terminator,以及 yakuake,都存在这个问题。
按说是没有关系,只是以防万一。我以前遇到过怎么改本地语言都不行的情况(除非使用 KDE 自己的配置工具),最后发现是 KDE 桌面自己还有一个设置文件作祟……
简单来说,complete -cf sudo 做了如下事:
告诉 bash,当你输入了 sudo 后,按下 Tab 尝试补全时,就当目前输入的命令行里没有 sudo
于是,bash 尝试补全出一个命令,然后的问题是,complete -cf sudo **覆盖了那个命令在 bash-completion 中的配置文件**
由此地,假设你输入了 sudo systemctl 后按 Tab,只会补全出当前目录下的文件 /目录,而不会是 systemctl 的 bash-completion 配置文件所提供的 arguments,比如 start, status, stop, reload...
在 bash 的配置文件(无论是 per-user 的~/.bashrc 还是 global 的 /etc/bash.bashrc)添加 complete -cf sudo,可能是 bash-completion 还没支持 sudo 这命令时,一种**头疼医头、脚疼医脚**的表面性的解决问题的方案。
毕竟如果没有这行命令,sudo 的补全应该回事当前目录下的文件,而不是任何命令,这显然是 unreasonable 的。
而加了这行命令,sudo 至少能被补全出系统的 PATH 中所有存在的程序(命令)了,至于这些命令能否被正常补全,这个解决方案的作者显然没考虑。
回到现在,bash-completion 已经支持了 sudo:
$ pacman -Ql bash-completion | grep sudo
bash-completion /usr/share/bash-completion/completions/sudo
bash-completion /usr/share/bash-completion/completions/sudoedit
这个命令起了反作用,让 sudo 的补全不能正常工作了,因此将它从 bash 的配置文件移除或注释掉。
参见:
bash 的文档中关于"可编程的自动补全"章节: https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion.html
一个更简单的版本,提及了 complete -cf 在做什么:
https://medium.com/marcos-oliveira/how-auto-complete-works-in-shell-linux-fe3c37b47361
非常感谢。估计这玩意儿就跟我以前遇到的一个驱动程序一个样儿:第一次双击就是安装,第二次双击就是卸载。非常无语。