Linux |奇怪的知识---complete命令---你不知道的命令参数补全---kubectl命令的参数补全

简介: Linux |奇怪的知识---complete命令---你不知道的命令参数补全---kubectl命令的参数补全

前言:

linux下有非常多的命令,其中有一些命令是比较冷门的,但比较有意思,比如,这个complete命令。

complete命令定义命令或者脚本内的方法的参数自动补全内容是什么(例如,定义某个命令的参数---可以是目录,可以是其它的命令,可以是一个词组,可以是一个脚本内的函数名),这个命令在某些特定的场合是可以提高我们的效率的(请注意关键词,命令和参数)。

命令补全和命令参数补全是两个不同的概念,这里大家一定要先区分清楚。

下面就详细介绍一哈此命令。

一,

命令的补全:

例如,任意的一个shell里面输入 com紧接着【tab】,这个是命令补全,只要命令在系统的shell的环境变量里,就可以补全,无需特别设置。

[root@master3 completions]# com
comm      command   compgen   complete  compopt   

命令的参数自动补全是什么?

我想大家应该都知道,命令可带参数也可以不带参数

例如,ls会打印当前目录下的所有可见内容,此时不需要参数。

ls -al 会打印当前目录下的所有文件和文件夹并包括它们的详细信息,此时,我们就说 -al是ls这个命令的参数,在准确点说 -al 是ls这个命令的短参数,什么叫短参数什么叫长参数就不在这废话了。这样的参数是传统的unix风格参数。

那么,还一种参数,例如 kubectl api-resources,这里,我们就会说 api-resources是kubelet的参数,只是这种参数是伯克利实验室最先使用的一种风格(小趣味知识,很早以前看过相关介绍,好像是这么说的)。

命令的参数自动补全是指的在某一个shell环境下,我们输入一个完整的命令后,空格 【tab】,shell会智能的补全剩下的参数。

例如,网络管理方面的常用命令ip,当我们安装了自动补全管理命令后:

首先输入 ip 空格  addr【tab】,在命令下面会返回给我们可能会出现的addr参数开始的所有参数

[root@master1 completions]# ip addr
address    addrlabel  
[root@master1 completions]# ip addr
address    addrlabel  

ip 空格  m【tab】 ,会列出以m开始的这些可用参数

[root@master1 completions]# ip m
macsec    maddress  monitor   mroute    mrule  

OK,命令的参数补全功能需要安装一个管理命令参数的命令,这里有点绕口,请大家仔细理解。

二,管理命令参数的命令的安装以及kubectl 这个命令的参数补全安装

在linux下安装命令为:

OK,如果你有搭建kubernetes集群,那么,可以通过kubectl命令的帮助查询到如何安装命令参数补全:

k completion --help

关于安装kubectl命令参数补全的帮助 输出如下:

  # Installing bash completion on macOS using homebrew
  ## If running Bash 3.2 included with macOS
  brew install bash-completion
  ## or, if running Bash 4.1+
  brew install bash-completion@2
  ## If kubectl is installed via homebrew, this should start working immediately
  ## If you've installed via other means, you may need add the completion to your completion directory
  kubectl completion bash > $(brew --prefix)/etc/bash_completion.d/kubectl
  # Installing bash completion on Linux
  ## If bash-completion is not installed on Linux, install the 'bash-completion' package
  ## via your distribution's package manager.
  ## Load the kubectl completion code for bash into the current shell
  source <(kubectl completion bash)
  ## Write bash completion code to a file and source it from .bash_profile
  kubectl completion bash > ~/.kube/completion.bash.inc
  printf "
  # Kubectl shell completion
  source '$HOME/.kube/completion.bash.inc'
  " >> $HOME/.bash_profile
  source $HOME/.bash_profile

总结一下,如果是macos系统,安装命令为:

brew install bash-completion

如果此macos的bash版本大于4.1,安装命令为:

brew install bash-completion@2

如果是linux操作系统,如果是最小化安装,此命令是没有默认安装的,需要搭建一个本地yum仓库或者使用网络yum仓库安装,那么,安装命令为:

yum -y install bash-completion

bash-completion安装完成后,需要激活一哈新装的脚本:

source /usr/share/bash-completion/bash_completion
echo "source <(kubectl completion bash)" > ~/.kube/completion.bash.inc
kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null
source ~/.kube/completion.bash.inc #当前用户激活kubectl 命令参数补全功能

如果是需要所有用户都可以使用kubectl 的参数补全:

source /usr/share/bash-completion/bash_completion
echo "source <(kubectl completion bash)" >>/etc/profile
echo "source /usr/share/bash-completion/bash_completion" >>/etc/profile
kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null

kubectl 命令的参数补全效果:

kubectl get svc -n 空格【tab】,会列出集群内所有的namespace:

[root@node1 ~]# kubectl get svc -n 
default          kube-node-lease  kube-public      kube-system 

OK,那么,如果想要使用别名kubectl呢?

echo "alias k=kubectl">>/etc/profile
echo "complete -F __start_kubectl k">>/etc/profile
source /etc/profile

测试如下:

k get pod -n 空格【tab】,将会列出所有namespace

[root@master1 completions]# k get pod -n 
default          kube-node-lease  kube-public      kube-system

k get pod -n kube-s【tab】 【tab】,将会列出kube-system这个命名空间下的所有pod

[root@master1 completions]# k get pod -n kube-system 
coredns-7f6cbbb7b8-7c85v         kube-apiserver-master2           kube-controller-manager-master2  kube-flannel-ds-b7zf9            kube-proxy-nkgdf                 kube-proxy-xmrp5                 kube-scheduler-master3
coredns-7f6cbbb7b8-h9wtb         kube-apiserver-master3           kube-controller-manager-master3  kube-flannel-ds-qcq66            kube-proxy-rb9zk                 kube-scheduler-master1           
kube-apiserver-master1           kube-controller-manager-master1  kube-flannel-ds-5jnr7            kube-flannel-ds-ztdk7            kube-proxy-rvbb7                 kube-scheduler-master2   

OK,这些设置将会极大的提高我们管理kubernetes集群的效率,那么,complete -F 这一串是什么情况呢?

其实根本原因在于kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null 此命令在/etc/bash_completion.d目录下生成了一个名称为kubelet的脚本,此脚本内有一个函数,通过complete -F 指定函数的形式激活了kubectl的别名

__start_kubectl()
{
    local cur prev words cword
    declare -A flaghash 2>/dev/null || :
    declare -A aliashash 2>/dev/null || :
    if declare -F _init_completion >/dev/null 2>&1; then
        _init_completion -s || return
    else
        __kubectl_init_completion -n "=" || return
    fi
    local c=0
    local flags=()
    local two_word_flags=()
    local local_nonpersistent_flags=()
    local flags_with_completion=()
    local flags_completion=()
    local commands=("kubectl")
    local must_have_one_flag=()
    local must_have_one_noun=()
    local has_completion_function
    local last_command
    local nouns=()

三,

complete命令设置参数补全

首先,我们看一下没有设置complete参数补全的命令是什么情况,以常用的ls命令为例:

本例中在root家目录下,ls  空格【tab】,此时会自动补全参数的全是当前目录下的文件夹和文件

[root@master1 ~]# pwd
/root
[root@master3 ~]# ls .
./             ../            .ansible/      .bash_history  .bash_logout   .bash_profile  .bashrc        .cshrc         .ssh/          .tcshrc        .viminfo    

complete -p 命令---查询命令的complete参数补全设置

此时的ls命令我们使用complete -p 看看它有没有设置参数补全(提示ls命令没有设置参数补全,只有默认的参数补全---参数是当前目录下的所有文件夹和文件):

[root@master3 ~]# complete -p ls
-bash: complete: ls: no completion specification

 

OK,现在使用complete命令更改ls命令参数只补全目录,不补全文件,可以看到设置后,ls命令的参数只补全文件夹了,root目录下就两个文件夹,并且查询complet 也是 -d ls了:

complete -d 命令---设置命令的参数为 文件夹

[root@master3 ~]# complete -d ls
[root@master3 ~]# ls .
./        ../       .ansible/ .ssh/     
[root@master3 ~]# complete -p ls
complete -d ls

取消complete对ls的参数补全设置:

[root@master3 ~]# complete -r ls
[root@master3 ~]# complete -p ls
-bash: complete: ls: no completion specification

complete -c 命令---设置命令的参数为命令

例如设置ls命令的参数补全为命令:

ls 空格【tab】,此时ls命令的参数补全是所有命令

[root@master3 ~]# complete -c ls
[root@master3 ~]# ls 
Display all 1456 possibilities? (y or n)
:                                         fipscheck                                 _kubectl_drain                            ntptime                                   ssh-add
!                                         fipshmac                                  _kubectl_edit                             numfmt                                    ssh-agent
./                                        firewall-cmd                              _kubectl_exec                             objcopy                                   ssh-copy-id
[                                         firewalld                                 _kubectl_explain                          objdump                                   sshd
。。。。。略略略

complete -W "词组" 命令 ---设置命令的参数为词组

例如,ls命令绑定词组 "start stop" ,ls 空格 【tab】,将会列出词组供选择

[root@master1 ~]# complete -W "start stop" ls
[root@master1 ~]# ls st
start  stop   

当然,对于ls命令这样是没有什么意义的,但脚本也可以利用complete绑定词组,这样会使得脚本更加的人性化,智能化:

例如,nginx.sh 这个脚本,绑定"start stop"作为参数,./nginx.sh 空格【tab】,将会列出词组作为参数供选择

[root@master1 ~]# ls nginx.sh
nginx.sh
[root@master1 ~]# complete -W "start stop " ./nginx.sh
[root@master1 ~]# ./nginx.sh st
start  stop   



命令参数补全主要是三个地方的脚本:

  • 第一个是/usr/share/bash-completion/bash_completion,此脚本极为重要,里面的内容比较多,也比较难懂,有兴趣的朋友可以去看看,此脚本是yum安装bash-completion程序后生成的。
  • 第二个是/usr/share/bash-completion/completions/这个目录下的脚本文件,是一些单独命令的参数设置。

例如look命令的参数设置脚本内容如下 :

cat /usr/share/bash-completion/completions/look

_look_module()
{
        local cur prev OPTS
        COMPREPLY=()
        cur="${COMP_WORDS[COMP_CWORD]}"
        prev="${COMP_WORDS[COMP_CWORD-1]}"
        case $prev in
                '-t'|'--terminate')
                        COMPREPLY=( $(compgen -W "char" -- $cur) )
                        return 0
                        ;;
                '-h'|'--help'|'-V'|'--version')
                        return 0
                        ;;
        esac
        case $cur in
                -*)
                        OPTS="--alternative --alphanum --ignore-case --terminate --version --help"
                        COMPREPLY=( $(compgen -W "${OPTS[*]}" -- $cur) )
                        return 0
                        ;;
        esac
        local IFS=$'\n'
        compopt -o filenames
        COMPREPLY=( $(compgen -f -- $cur) )
        return 0
}
complete -F _look_module look

look --空格【tab】,此时会列出  OPTS="--alternative --alphanum --ignore-case --terminate --version --help" 这些上述脚本定义的参数

root@master1 ~]# look --
--alphanum     --alternative  --help         --ignore-case  --terminate    --version

 

  • 第三个是/etc/bash_completion.d这个目录下的脚本,kubectl这个命令的参数补全脚本就存放在此,此脚本使用的是关键自定义函数:

cat /etc/bash_completion.d/kubectl 最后的一段

__start_kubectl()
{
    local cur prev words cword
    declare -A flaghash 2>/dev/null || :
    declare -A aliashash 2>/dev/null || :
    if declare -F _init_completion >/dev/null 2>&1; then
        _init_completion -s || return
    else
        __kubectl_init_completion -n "=" || return
    fi
    local c=0
    local flags=()
    local two_word_flags=()
    local local_nonpersistent_flags=()
    local flags_with_completion=()
    local flags_completion=()
    local commands=("kubectl")
    local must_have_one_flag=()
    local must_have_one_noun=()
    local has_completion_function
    local last_command
    local nouns=()
    __kubectl_handle_word
}
if [[ $(type -t compopt) = "builtin" ]]; then
    complete -o default -F __start_kubectl kubectl
else
    complete -o default -o nospace -F __start_kubectl kubectl
fi
# ex: ts=4 sw=4 et filetype=sh

那么,如果我们写的有比较复杂的带有很多参数的脚本,也就可以仿照以上的脚本形式写自定义的参数补全脚本,从而方便我们自己使用脚本或者命令。(目前我还写不出来太复杂的脚本,因此,参数补全脚本也就没机会自己定义了)。

命令的参数补全意义是比较重大的,通过命令的参数补全功能我们可以快速的上手命令,并对命令的使用加深记忆,这种情况尤其适用于像kubelet这样的参数非常多的命令

以上就是命令的参数补全基本原理以及一些简单的通过complete命令设定命令的参数补全。

目录
相关文章
|
9月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
984 1
二、Linux文本处理与文件操作核心命令
|
9月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
585 137
|
9月前
|
安全 Ubuntu Unix
一、初识 Linux 与基本命令
玩转Linux命令行,就像探索一座新城市。首先要熟悉它的“地图”,也就是/根目录下/etc(放配置)、/home(住家)这些核心区域。然后掌握几个“生存口令”:用ls看周围,cd去别处,mkdir建新房,cp/mv搬东西,再用cat或tail看文件内容。最后,别忘了随时按Tab键,它能帮你自动补全命令和路径,是提高效率的第一神器。
1525 58
|
12月前
|
JSON 自然语言处理 Linux
linux命令—tree
tree是一款强大的Linux命令行工具,用于以树状结构递归展示目录和文件,直观呈现层级关系。支持多种功能,如过滤、排序、权限显示及格式化输出等。安装方法因系统而异常用场景包括:基础用法(显示当前或指定目录结构)、核心参数应用(如层级控制-L、隐藏文件显示-a、完整路径输出-f)以及进阶操作(如磁盘空间分析--du、结合grep过滤内容、生成JSON格式列表-J等)。此外,还可生成网站目录结构图并导出为HTML文件。注意事项:使用Tab键补全路径避免错误;超大目录建议限制遍历层数;脚本中推荐禁用统计信息以优化性能。更多详情可查阅手册mantree。
1077 143
linux命令—tree
|
8月前
|
存储 安全 Linux
Linux卡在emergency mode怎么办?xfs_repair 命令轻松解决
Linux虚拟机遇紧急模式?别慌!多因磁盘挂载失败。本文教你通过日志定位问题,用`xfs_repair`等工具修复文件系统,三步快速恢复。掌握查日志、修磁盘、验重启,轻松应对紧急模式,保障系统稳定运行。
1373 2
|
9月前
|
Unix Linux 程序员
Linux文本搜索工具grep命令使用指南
以上就是对Linux环境下强大工具 `grep` 的基础到进阶功能介绍。它不仅能够执行简单文字查询任务还能够处理复杂文字处理任务,并且支持强大而灵活地正则表达规范来增加查询精度与效率。无论您是程序员、数据分析师还是系统管理员,在日常工作中熟练运用该命令都将极大提升您处理和分析数据效率。
752 16
|
9月前
|
缓存 监控 Linux
Linux内存问题排查命令详解
Linux服务器卡顿?可能是内存问题。掌握free、vmstat、sar三大命令,快速排查内存使用情况。free查看实时内存,vmstat诊断系统整体性能瓶颈,sar实现长期监控,三者结合,高效定位并解决内存问题。
855 0
Linux内存问题排查命令详解
|
11月前
|
监控 Linux 网络安全
Linux命令大全:从入门到精通
日常使用的linux命令整理
1695 13
|
12月前
|
Linux 网络安全 数据安全/隐私保护
使用Linux系统的mount命令挂载远程服务器的文件夹。
如此一来,你就完成了一次从你的Linux发车站到远程服务器文件夹的有趣旅行。在这个技术之旅中,你既探索了新地方,也学到了如何桥接不同系统之间的距离。
1985 21
|
12月前
|
监控 Linux
Linux系统中使用df命令详解磁盘使用情况。
`df`命令是Linux系统管理员和用户监控和管理磁盘空间使用的重要工具。掌握它的基本使用方法和选项可以帮助在必要时分析和解决空间相关问题。简洁但功能丰富,`df`命令确保了用户可以快速有效地识别和管理文件系统的空间使用情况。
869 13