V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
jzq526
V2EX  ›  Linux

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

  •  
  •   jzq526 · 2020-08-02 10:00:20 +08:00 · 3372 次点击
    这是一个创建于 1335 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    第 1 条附言  ·  2020-08-03 11:08:56 +08:00
    zsh 据说可以解决,但我用不惯 zsh 。

    而且换了 zsh,bash 的问题还在。

    最后感谢 @Hardrain 提供了注释掉.bashrc 中的`complete -cf sudo`的方法。

    但不明白的是,这个命令本来应该是让 sudo 后面可以用补全功能的……

    继续折腾吧
    19 条回复    2020-08-05 16:39:50 +08:00
    itskingname
        1
    itskingname  
       2020-08-02 10:08:19 +08:00
    觉得这可能是它自带的终端模拟器的问题。你换一个终端模拟器看看?
    Jirajine
        2
    Jirajine  
       2020-08-02 10:11:24 +08:00 via Android
    换 zsh,用 ohmyzsh 有 sudo 的插件。
    vk42
        3
    vk42  
       2020-08-02 10:11:48 +08:00
    你用的什么 shell,这个应该是 shell 配置的问题
    Yadomin
        4
    Yadomin  
       2020-08-02 10:13:52 +08:00 via Android
    bash-completion 的问题…
    Nitroethane
        5
    Nitroethane  
       2020-08-02 10:16:10 +08:00 via iPhone
    假定你用的 zsh,看这篇贴子里用到了 zstyle,https://forums.gentoo.org/viewtopic-t-1053122-start-0.html
    iamwho
        6
    iamwho  
       2020-08-02 10:17:06 +08:00
    sudo pacman -S bash-completion

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

    ```
    complete -cf sudo
    ```

    使其不生效(注释掉 /移除)
    Jat001
        8
    Jat001  
       2020-08-02 11:54:50 +08:00 via iPhone
    这跟 kde 和 manjaro 没什么关系,是 shell 配置错误
    nguoidiqua
        9
    nguoidiqua  
       2020-08-02 13:05:56 +08:00
    换 shell 比如 fish
    reedthink
        10
    reedthink  
       2020-08-02 13:20:51 +08:00
    换 zsh 吧,好看又好用
    whenov
        11
    whenov  
       2020-08-02 13:26:48 +08:00
    @iamwho 第二句在 /etc/bash.bashrc 里面有吧
    zhuangzhuang1988
        12
    zhuangzhuang1988  
       2020-08-02 23:16:44 +08:00
    换 powershell 吧,好看又好用
    jzq526
        13
    jzq526  
    OP
       2020-08-03 09:05:50 +08:00
    @Hardrain 你这个方法是目前唯一有效的。问题是:为什么?我在.bashrc 中添加了一条 complete -cf man,然后 man 命令后面就可以自动补全了,之前是不行的,但现在注释掉 complete -cf sudo,反而 sudo 后面就能自动补全但之前不行呢?
    jzq526
        14
    jzq526  
    OP
       2020-08-03 11:04:29 +08:00
    @vk42 bash,默认的。
    jzq526
        15
    jzq526  
    OP
       2020-08-03 11:05:09 +08:00
    @itskingname 换了个 terminator,以及 yakuake,都存在这个问题。
    jzq526
        16
    jzq526  
    OP
       2020-08-03 11:11:02 +08:00
    @Jat001 按说是没有关系,只是以防万一。我以前遇到过怎么改本地语言都不行的情况(除非使用 KDE 自己的配置工具),最后发现是 KDE 桌面自己还有一个设置文件作祟……
    Hardrain
        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...
    Hardrain
        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
    jzq526
        19
    jzq526  
    OP
       2020-08-05 16:39:50 +08:00
    @Hardrain 非常感谢。估计这玩意儿就跟我以前遇到的一个驱动程序一个样儿:第一次双击就是安装,第二次双击就是卸载。非常无语。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2807 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 14:38 · PVG 22:38 · LAX 07:38 · JFK 10:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.