自定义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] systemctladd
-requires daemon-reexec enable hybrid-sleepkill list-units reload-or-restart set-property suspendadd
-wants daemon-reload exit is-active link mask reload-or-try-restart show switch-rootcancel 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 unmaskcondreload disable halt isolate list
-sockets reboot restart start unset-environmentcondrestart edit help is
-system-running list-timers reenable set-default statuscondstop 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] gitadd 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]}; # 用户输入单词赋值给curlocal 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镜像或者容器的名称,非常方便
[root@localhost ~]# dockerqimages pull run start
[root@localhost
~]# dockerq runadoring_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
[root@localhost
~]# dockerq run ^C[root@localhost
~]# dockerq imagesabh1nav
/dockerui composetest_web feisky/nginx mysql redisalpine docker
/compose feisky/php-fpm nginx todoappbusybox dockerinpractice
/dockerfile-from-image hello-world node ubuntucenturylink
/dockerfile-from-image dockerinpractice/docker-image-graph lukapeschke/dfa python wordpress[root@localhost
~]# dockerq images
希望这篇文章对你有帮助。
以上是 自定义linux命令参数补全以提高工作效率 的全部内容, 来源链接: utcz.com/z/514838.html