自定义linux命令参数补全以提高工作效率

  我们在使用bash命令时,会经常使用二次tab键进行补齐。

例如我们常用的telnet命令,在输入二次tab键时,会列出当前系统配置的所有主机名,供选择

# 输入 telnet <Tab> <Tab>
[huangcihui:/home/huangcihui] telnet
::1                      localhost                localhost4               localhost4.localdomain4  localhost6               localhost6.localdomain6  localhost.localdomain
[huangcihui:/home/huangcihui] telnet 

在输入telnet参数过程中按回车,系统也会自动补全主机名

#输入 telnet l<Tab>
[huangcihui:/home/huangcihui] telnet localhost

  其它常用命令,也会有这个功能。 例如systemctl,输入二次tab键时会列出systemctl所有子命令参数

#systemctl <Tab><Tab>
[huangcihui:/home/huangcihui] systemctl
add-requires           daemon-reexec          enable                 hybrid-sleep           kill                   list-units             reload-or-restart      set-property           suspend
add-wants              daemon-reload          exit                   is-active              link                   mask                   reload-or-try-restart  show                   switch-root
cancel                 default                force-reload           is-enabled             list-dependencies      poweroff               rescue                 show-environment       try-restart
cat                    delete                 get-default            is-failed              list-jobs              preset                 reset-failed           snapshot               unmask
condreload             disable                halt                   isolate                list-sockets           reboot                 restart                start                  unset-environment
condrestart            edit                   help                   is-system-running      list-timers            reenable               set-default            status
condstop               emergency              hibernate              kexec                  list-unit-files        reload                 set-environment        stop
[huangcihui:/home/huangcihui] systemctl 

  那么,自己开发的程序,能不能实现Tab自动补全? 答案是肯定的,借助bash的complete命令即可。

假设我们新写了一个命令叫tel,我们想让它实现telnet的被全主机名功能,用这个命令即可:complete -A hostname tel 效果如下:

[huangcihui:/home/huangcihui] complete -A hostname tel
[huangcihui:/home/huangcihui] #tel l<Tab>
[huangcihui:/home/huangcihui] tel localhost

  而像systemctl这种补全子命令的功能,要怎么做呢? 下面我演示一下怎么让git命令实现子命令补全功能

[huangcihui:/home/huangcihui] complete -W "add checkout clone commit diff pull push status" git
[huangcihui:/home/huangcihui] #git <Tab>
[huangcihui:/home/huangcihui] git
add       checkout  clone     commit    diff      pull      push      status
[huangcihui:/home/huangcihui] git 

  complete还有更多复杂的用法,有兴趣可以参考这篇文章

https://blog.csdn.net/koprvhdix/article/details/81036240
Linux Shell 命令自动补全(各方资料汇总补全版) Clockworkai

  下面是我使用complete命令帮我自定义的dockerq命令进行自动补全的函数

# 新建一个命令dockerq 用于快速操作docker
__dockerq()
{
        COMPREPLY=() # 清空候选列表
        local cur=${COMP_WORDS[COMP_CWORD]}; # 用户输入单词赋值给cur
        local cmd=${COMP_WORDS[COMP_CWORD-1]}; # 用户正在操作的命令或者子命令
    case $cmd in
    ‘dockerq‘)
                # 获取docker所有命令
                # local cmdlist=$(docker --help|awk ‘{if ($1 == "Commands:") { v_showFlag = 1; next; } else if ($1 == "") v_showFlag = 0; if (v_showFlag) print $1;}‘)

                cmdlist="images pull start run"
                # 获取以cul开头的所有命令
                local wordlist="$(compgen -W "${cmdlist}" -- $cur)"

                # 给候选列表赋值
                COMPREPLY=( ${wordlist} ) ;;
    ‘images‘)
                #使用docker images获取所有镜像名称
                local cmdlist=$(docker images|awk ‘{if (NR != 1) print $1;}‘)

                # 获取以cul开头的所有命令
                local wordlist="$(compgen -W "${cmdlist}" -- $cur)"

                # 给候选列表赋值
                COMPREPLY=( ${wordlist} ) ;;

    ‘run‘)
                #使用docker ps获取所有容器名称
                local cmdlist=$(docker ps -a|awk ‘{if (NR != 1) print $NF;}‘)

                # 获取以cul开头的所有命令
                local wordlist="$(compgen -W "${cmdlist}" -- $cur)"

                # 给候选列表赋值
                COMPREPLY=( ${wordlist} ) ;;
    ‘*‘)
                ;;
    esac
    if [[ "${COMP_WORDS[1]}" == "read" && ${COMP_CWORD} -eq 2 ]]; then
                local pro=($(pwd))
                cd /data
                compopt -o nospace
                COMPREPLY=($(compgen -d -f -- $cur))
                cd $pro
                fi
    return 0
}
complete -F  __dockerq dockerq
alias dockerq=docker

  使用dockerq命令时,按Tab键可以自动补齐docker镜像或者容器的名称,非常方便

[[email protected] ~]# dockerq
images  pull    run     start
[[email protected] ~]# dockerq run
adoring_wozniak      charming_ptolemy     composetest_web_1    determined_hodgkin   exciting_cartwright  hardcore_mestorf     hungry_mclean        mystifying_cohen     nginx001             thirsty_franklin
alptest1             composetest_redis_1  cpu_set_demo         example1             exp1                 heuristic_cannon     magical_cartwright   nginx                phpfpm               thirsty_merkle
[[email protected] ~]# dockerq run ^C
[[email protected] ~]# dockerq images
abh1nav/dockerui                        composetest_web                         feisky/nginx                            mysql                                   redis
alpine                                  docker/compose                          feisky/php-fpm                          nginx                                   todoapp
busybox                                 dockerinpractice/dockerfile-from-image  hello-world                             node                                    ubuntu
centurylink/dockerfile-from-image       dockerinpractice/docker-image-graph     lukapeschke/dfa                         python                                  wordpress
[[email protected] ~]# dockerq images 

  希望这篇文章对你有帮助。

原文地址:https://www.cnblogs.com/kingstarer/p/12586721.html

时间: 2024-08-08 14:12:43

自定义linux命令参数补全以提高工作效率的相关文章

linux 命令自动补全包

linux 其他知识目录 rhel7如果使用最小化安装后,tab键默认是不能自动补全命令的 执行yum install bash-completion之后重启系统正常. 原文地址:https://www.cnblogs.com/machangwei-8/p/10350856.html

解决centos7命令无法补全

背景 偶然发现本地虚拟机centos 7.7配置firewalld-cmd命令行无法补全,手敲命令太多,着实麻烦 解决方案 安装linux命令行补全工具,还能够补全命令参数 yum install bash-completion -y 安装完毕,重新登录,加载新bash环境变量,即可使用 原文地址:https://www.cnblogs.com/pyyu/p/12185823.html

Linux 中 10 个有用的命令行补全例子

在 Linux 系统中,当你输入一个命令,再按两次 TAB 键,就会列出所有以你输入字符开头的可用命令.这并不新鲜,可能你已经知道了.这个功能被称作命令行补全bash completion.默认情况下,bash 命令行可以自动补全文件或目录名称.不过,我们可以增强 bash 命令补全功能,通过 complete 命令让它达到新的高度. 这个教程说明了我们是怎样使用可编程的命令行补全功能programmable completion把自动补全功能应用于选项或者命令行参数. 例如:在输入 write

Powershell中命令自动补全功能及使用Windows命令

上一节主要介绍了Powershell中常见的别名,以及怎么通过别名查看真实的Powershell命令,Powershell别名的命名规范以及如何新建自己的别名(Powershell内置别名不可更改)以及Powershell中兼容性别名,详细内容点击这里. 在本节主要包含以下内容. Powershell命令自动补全功能. 在Powershell中使用cmd命令. 总结 Powershell中命令自动补全功能 Powershell命令自动补全的功能也称为Tab扩展,自动补全的功能可以大大提高命令输入

在python的交互式解释器中实现命令自动补全

Python的交互式解释器没有自带像Linux Shell那样的命令自动补全功能,可以编写一个模块来实现这一功能,模块源代码来自老男孩Linux培训机构的Python讲师Alex: # python startup file import sys import readline # tab completion readline.parse_and_bind('tab: complete')

python命令行补全

python命令行补全 大家都知道,在命令行界面输入命令时,是可通过tab键来补齐命令,这中设置十分方便,不用浪费较长时间在输入命令上.最近开始接触python,发现在python命令行下,使用tab键是无法补全命令的.我们可以设置成补全命令行的模式吗?答案是可以的. 我们可以在python命令行下导入模块 import readline, rlcompleter; readline.parse_and_bind("tab: complete") 这样设置,我们就可以使用tab键来补全

命令自动补全模块rlcomplete

rlcomplete定义了针对readline模块的命令自动补全函数. 当在unix平台下导入这个模块之后(前提是readline模块可用),一个Complete的实例会自动生成,并且它的complete()方法会被设置为readline的自动补全函数. 例如: >>>import rlcompleter >>>import readline >>> readline.parse_and_bind("tab: complete")

常使Linux快捷键提高工作效率

近期在工作中发现经常性的使用一些重复性命令,经常性的修改一些长明令,感觉有必要科普一下shell命令行的一些常见快捷键了,以便大家节省时间提高工作效率. 下述所有命令在Linux/unix的shell下有效,这里以bash为主.如有出入,以你自己的服务器为准.本文所指的Linux主要指RHEL/CentOS,unix指的是FreeBSD,这也是服务器中用得最多的版本. Ctrl + a 切换到命令行开始 这个操作跟Home实现的结果一样的,但Home在某些unix环境下无法使用,便可以使用这个组

word 2010自定义快捷键提高工作效率

经常使用word处理文档, 做笔记的时候会把word文档框缩小,以便同时看pdf同时记录笔记,但是缩小的word框不能把所有的菜单项显示出来,我比较常用那个插入边框下面的那个横线来做分割符,但是缩小了word之后那个菜单项显示不出来,每次要用的时候都要先最大化word,操作完了之后再恢复原来的大小来一边看书一边记录笔记,這样很慢,下面就是如何操作自定义word快捷键来辅助记录笔记.以下以自定义边框项下面的那个横线的快捷键为例予以说明如何添加自定义快捷键. 1.在菜单项上右键选择:自定义功能区 2