bash 在使用 sudo 时不会自动完成我的命令?

qua*_*nta 7 osx bash sudo autocomplete

我正在使用 SaltStack。我想在调用salt命令时自动完成仆从名称。

以下行已添加到~/.bashrc

complete -o default -o nospace -W "$(sudo ls -1 /var/cache/salt/master/minions)" salt
Run Code Online (Sandbox Code Playgroud)

然后打字?; 我可以看到它按预期工作:salt inTabsalt integration-Tab

$ salt 集成-TabTab
集成-c 集成-u 集成-u2

要与 一起使用sudo,我已添加complete -cf sudo到 中~/.bashrc,但它不起作用:

    须藤盐Tab

    什么也没回。

    我还尝试安装bash_completion并将以下几行添加到~/.bash_profile

    if [ -f $(brew --prefix)/etc/bash_completion ]; then
        . $(brew --prefix)/etc/bash_completion
    fi
    
    Run Code Online (Sandbox Code Playgroud)

    但没有运气。

    我错过了什么?


    更新

    哦,我想说的第一件事是有时它有效:

    $ sudo salt 集成-TabTab
    集成-c 集成-u 集成-u2

    有时不会。

    所以首先,让我们看看你的 bash_completion 包做了多少。

    我该如何检查?这是我的功能:

    complete -o default -o nospace -W "$(sudo ls -1 /var/cache/salt/master/minions)" salt
    
    Run Code Online (Sandbox Code Playgroud)

    如果您键入sudo mkdirTabTab,它是否显示目录列表?

    是的:

    $ sudo mkdir TabTab
    .FontForge/ .djangopypi2/ .ievms/ .ssh/ .wireshark-etc/

Tob*_*ght -1

sudo除非您使用 请求,否则不会为您提供登录 shell -i。所以你会发现没有它你需要加载系统的补全:

. /etc/bash_completion
Run Code Online (Sandbox Code Playgroud)

如果您使用 运行-i,则将$HOME~root,因此写入用户的任何内容都~/.bashrc不会被读取。如果您可以将完成的内容与其余部分分开~/.bashrc,请使用.和 来获取它,这应该可以工作。