在 manjaro ( KDE )中,使用 sudo 时不能补全参数。例如输入 sudo systemctl res,此时按下 tab 键,出现的提示并不包括 restart 。使用 pacman 安装软件时也不能补全软件名。 但不加 sudo 就可以补全参数或软件名,普通用户和 root 用户均是如此。 (baidu 上查到过很多方法,但无一有效) 不过 debian 、ubuntu 和 centos 都没有这个问题…… 请教高手, 这个问题怎么解决? 先行谢过
1
itskingname 2020-08-02 10:08:19 +08:00
觉得这可能是它自带的终端模拟器的问题。你换一个终端模拟器看看?
|
2
Jirajine 2020-08-02 10:11:24 +08:00 via Android
换 zsh,用 ohmyzsh 有 sudo 的插件。
|
3
vk42 2020-08-02 10:11:48 +08:00
你用的什么 shell,这个应该是 shell 配置的问题
|
4
Yadomin 2020-08-02 10:13:52 +08:00 via Android
bash-completion 的问题…
|
5
Nitroethane 2020-08-02 10:16:10 +08:00 via iPhone
假定你用的 zsh,看这篇贴子里用到了 zstyle,https://forums.gentoo.org/viewtopic-t-1053122-start-0.html
|
6
iamwho 2020-08-02 10:17:06 +08:00
sudo pacman -S bash-completion
echo '. /usr/share/bash-completion/bash_completion' >> ~/.bashrc |
7
Hardrain 2020-08-02 10:46:49 +08:00
在`~/.bashrc`或`/etc/bash.bashrc`中找到
``` complete -cf sudo ``` 使其不生效(注释掉 /移除) |
8
Jat001 2020-08-02 11:54:50 +08:00 via iPhone
这跟 kde 和 manjaro 没什么关系,是 shell 配置错误
|
9
nguoidiqua 2020-08-02 13:05:56 +08:00
换 shell 比如 fish
|
10
reedthink 2020-08-02 13:20:51 +08:00
换 zsh 吧,好看又好用
|
12
zhuangzhuang1988 2020-08-02 23:16:44 +08:00
换 powershell 吧,好看又好用
|
13
jzq526 OP @Hardrain 你这个方法是目前唯一有效的。问题是:为什么?我在.bashrc 中添加了一条 complete -cf man,然后 man 命令后面就可以自动补全了,之前是不行的,但现在注释掉 complete -cf sudo,反而 sudo 后面就能自动补全但之前不行呢?
|
15
jzq526 OP @itskingname 换了个 terminator,以及 yakuake,都存在这个问题。
|
16
jzq526 OP @Jat001 按说是没有关系,只是以防万一。我以前遇到过怎么改本地语言都不行的情况(除非使用 KDE 自己的配置工具),最后发现是 KDE 桌面自己还有一个设置文件作祟……
|
17
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... |
18
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 |