在 manjaro(KDE)中,使用 sudo 时不能补全参数

2020-08-02 10:00:20 +08:00
 jzq526

在 manjaro ( KDE )中,使用 sudo 时不能补全参数。例如输入 sudo systemctl res,此时按下 tab 键,出现的提示并不包括 restart 。使用 pacman 安装软件时也不能补全软件名。 但不加 sudo 就可以补全参数或软件名,普通用户和 root 用户均是如此。 (baidu 上查到过很多方法,但无一有效) 不过 debian 、ubuntu 和 centos 都没有这个问题…… 请教高手, 这个问题怎么解决? 先行谢过

3412 次点击
所在节点    Linux
19 条回复
itskingname
2020-08-02 10:08:19 +08:00
觉得这可能是它自带的终端模拟器的问题。你换一个终端模拟器看看?
Jirajine
2020-08-02 10:11:24 +08:00
换 zsh,用 ohmyzsh 有 sudo 的插件。
vk42
2020-08-02 10:11:48 +08:00
你用的什么 shell,这个应该是 shell 配置的问题
Yadomin
2020-08-02 10:13:52 +08:00
bash-completion 的问题…
Nitroethane
2020-08-02 10:16:10 +08:00
假定你用的 zsh,看这篇贴子里用到了 zstyle,https://forums.gentoo.org/viewtopic-t-1053122-start-0.html
iamwho
2020-08-02 10:17:06 +08:00
sudo pacman -S bash-completion

echo '. /usr/share/bash-completion/bash_completion' >> ~/.bashrc
Hardrain
2020-08-02 10:46:49 +08:00
在`~/.bashrc`或`/etc/bash.bashrc`中找到

```
complete -cf sudo
```

使其不生效(注释掉 /移除)
Jat001
2020-08-02 11:54:50 +08:00
这跟 kde 和 manjaro 没什么关系,是 shell 配置错误
nguoidiqua
2020-08-02 13:05:56 +08:00
换 shell 比如 fish
reedthink
2020-08-02 13:20:51 +08:00
换 zsh 吧,好看又好用
whenov
2020-08-02 13:26:48 +08:00
@iamwho 第二句在 /etc/bash.bashrc 里面有吧
zhuangzhuang1988
2020-08-02 23:16:44 +08:00
换 powershell 吧,好看又好用
jzq526
2020-08-03 09:05:50 +08:00
@Hardrain 你这个方法是目前唯一有效的。问题是:为什么?我在.bashrc 中添加了一条 complete -cf man,然后 man 命令后面就可以自动补全了,之前是不行的,但现在注释掉 complete -cf sudo,反而 sudo 后面就能自动补全但之前不行呢?
jzq526
2020-08-03 11:04:29 +08:00
@vk42 bash,默认的。
jzq526
2020-08-03 11:05:09 +08:00
@itskingname 换了个 terminator,以及 yakuake,都存在这个问题。
jzq526
2020-08-03 11:11:02 +08:00
@Jat001 按说是没有关系,只是以防万一。我以前遇到过怎么改本地语言都不行的情况(除非使用 KDE 自己的配置工具),最后发现是 KDE 桌面自己还有一个设置文件作祟……
Hardrain
2020-08-04 22:20:01 +08:00
@jzq526 简单来说,complete -cf sudo 做了如下事:

告诉 bash,当你输入了 sudo 后,按下 Tab 尝试补全时,就当目前输入的命令行里没有 sudo

于是,bash 尝试补全出一个命令,然后的问题是,complete -cf sudo **覆盖了那个命令在 bash-completion 中的配置文件**

由此地,假设你输入了 sudo systemctl 后按 Tab,只会补全出当前目录下的文件 /目录,而不会是 systemctl 的 bash-completion 配置文件所提供的 arguments,比如 start, status, stop, reload...
Hardrain
2020-08-04 22:25:58 +08:00
@jzq526 在 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
jzq526
2020-08-05 16:39:50 +08:00
@Hardrain 非常感谢。估计这玩意儿就跟我以前遇到的一个驱动程序一个样儿:第一次双击就是安装,第二次双击就是卸载。非常无语。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/694959

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX