假设您的 中有以下别名.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 …
命令时,加载了如下代码:
. /usr/share/bash-completion/bash_completion
;__load_completion 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] 删除。
我来说两句