如何自动完成以(涉及别名)sudo 开头的 shell 命令

埃里克医学博士

假设您的 中有以下别名.bashrc

alias docker='sudo docker'

然后尝试docker run -v /tmp/test:/foo …在 bash 终端中自动完成,从docker run -v /tmp|开始 → 由于sudo别名中的存在,会出现以下令人分心的行为:

$ docker run -v /tmp TAB
$ docker run -v /tmp[sudo] 用户密码:

此时,除了执行Ctrl+C和重新启动之外,几乎不可能进一步编辑命令行

是否有克服这种行为的解决方案?即,保留sudo别名中隐含信息,但当我们只是期待一些常规的自动完成时避免密码提示。

独立于该alias功能的解决方案会很好(考虑到此处提出的问题在$ sudo command …直接键入 any 时也会出现)。

埃里克医学博士

依靠@ApolloXI 关于sudo -n并进行更多实验的建议,我能够克服我在之前的评论中提到的缺点

综上所述,在自动补全docker …命令时,加载了如下代码:

  • 从 /etc/bash.bashrc: . /usr/share/bash-completion/bash_completion;
  • 来自 /usr/share/bash-completion/bash_completion:
    • __load_completion docker,
    • 那么. /usr/share/bash-completion/completions/docker
  • 从 /usr/share/bash-completion/completions/docker:
    • docker version -f '{{.Client.Experimental}} {{.Server.Experimental}} {{.Server.Os}}, 等等。
    • 它重新运行docker命令(或别名,如果存在)。

因此,一个可行的解决方案就是用 bash 函数替换我的别名,检测它是否是从 bash-completion 功能调用的这可以通过读取BASH_SOURCE数组来完成

因此,我们可以采用以下解决方案:

docker() {
    if [[ "${BASH_SOURCE[*]}" =~ "bash-completion" ]]; then
        sudo -n docker "$@"
    else
        sudo docker "$@"
    fi
}

或者,如果我们希望能够轻松禁用包装器,请改为编写:

__docker() {
    if [[ "${BASH_SOURCE[*]}" =~ "bash-completion" ]]; then
        docker "$@"
    else
        sudo docker "$@"
    fi
}

alias docker=__docker

然后,sudo -n前缀不再是必需的,并且可以运行例如:

$ \docker run --help

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使Shell自动完成文件路径的开头?

来自分类Dev

shell 命令的 GDB 别名

来自分类Dev

当它以空格开头时,是否可以从zsh shell历史记录中删除先前的命令?

来自分类Dev

在zsh中如何在外部命令完成之前遍历shell函数完成和别名完成?

来自分类Dev

以制表符开头的粘贴Bash命令时的完成

来自分类Dev

sox命令会自动在mp3开头添加延迟

来自分类Dev

如何执行新的Shell命令?

来自分类Dev

如何执行Shell内置命令

来自分类Dev

如何遍历shell命令的输出?

来自分类Dev

如何从shell运行Vim命令?

来自分类Dev

如何创建新的Shell命令?

来自分类Dev

如何更改at命令的默认shell

来自分类Dev

如何读取shell命令的输出

来自分类Dev

如何在以“-”开头的文件上使用命令

来自分类Dev

如何从Linux的Shell中删除所有以._开头的文件?

来自分类Dev

C Shell-如何检查参数是否以'-'字符开头?

来自分类Dev

bash别名:在shell命令中使用参数

来自分类Dev

在git命令中使用git shell别名

来自分类Dev

Bash grep命令以开头或结尾

来自分类Dev

Perl如何让线程等到Shell完成命令执行

来自分类Dev

如何使用find命令自动转义shell元字符?

来自分类Dev

如何在shell脚本中自动读取命令?

来自分类Dev

内置的shell命令“类型”如何知道给定命令的路径?

来自分类Dev

Clojure:如何使用管道执行Shell命令?

来自分类Dev

如何通过shell脚本执行vim命令

来自分类Dev

编译任务前如何执行shell命令?

来自分类Dev

如何使用shell命令启动Genymotion设备?

来自分类Dev

如何在Shell命令中交换参数

来自分类Dev

如何引用shell脚本命令?