自动补全命令,就是在我们输入命令的时候使用Tab键可以补全命令,或展示可能的命令

如nginx目录下

我们看到有以下文件

1. 只有一条命令满足的情况

输入部分指令后,按下tab键,如果只有一个命令满足,则会补全完整的命令

2. 有多条命令满足的情况

此时我们按下Tab键,不会完成补全,这是如果我们连续按下两次Tab键,就会把所有复合的命令都展示出来

这时我们继续完善命令即可。在完善时可以充分使用Tab键自动补全

如何补全我们自己写的脚本命令呢?

我们找一个场景吧:

一个服务器上启动多个tomcat

在x_install文件夹中放了多个服务

1.首选需要我们自己编写命令脚本:

这里我们用tomcat的命令脚本举例,包含了启动、暂停、重启、状态、日志等功能

#!/bin/bash
BUILD_ID=DONTKILLME
TOMCAT_HOME=/opt/tomcat
serviceNames=$(ls /opt/tomcat/x_install/  |grep Service)
commands='start stop restart status log errlog'
RETVAL="0"serviceName=$1
if [ x"$1" = x ]; then echo '请输入服务名:'$serviceNamesexit 1
fiisService=$(echo $serviceNames | grep "${serviceName}")
if [[ "$isService" = "" ]]; thenecho '无效服务名'echo '服务名:'$serviceNamesexit 1
fiif [ x"$2" = x ]; then echo '请输入执行命令:'$commandsexit $RETVAL
fiisCommand=$(echo $commands | grep "$2")
if [[ "$isCommand" = "" ]]; thenecho '无效执行命令'echo '命令:'$commandsexit $RETVAL
fiexport CATALINA_HOME=$TOMCAT_HOME
export CATALINA_BASE=$CATALINA_HOME/x_install/$serviceNamenum=0
if [ x"$3" != x ]; then
num=$3
fistart() {
ps aux |grep $CATALINA_BASE/conf |grep -v "grep" >/dev/null
if [ $? -eq 0 ];thenecho  $serviceName" is running"
else      echo "tomcat is down"find / |grep "/jre/lib/rt.jar" |grep -v "grep" >/dev/nullif [ $? -eq 0 ];thenjavahome=$(find / |grep "/jre/lib/rt.jar" |head -1 |awk '{print $1}')export JRE_HOME=${javahome%*/lib/rt.jar}export PATH=$JRE_HOME/bin:$PATHexport CLASSPATH=.:$JRE_HOME/libif [[ "$serviceName" = "ReviewService" ]]; thenecho $serviceName' 设置运行内存1024m'export JAVA_OPTS='-Xms128m -Xmx1024m'elif [[ "$serviceName" = "BiddingService" ]]; thenecho $serviceName' 设置运行内存1024m'export JAVA_OPTS='-Xms128m -Xmx1024m'elif [[ "$serviceName" = "OpenBiddingService" ]]; thenecho $serviceName' 设置运行内存1024m'export JAVA_OPTS='-Xms128m -Xmx1024m'elseexport JAVA_OPTS='-Xms128m -Xmx512m'fielseecho "未找到java环境"exit $RETVALfiif [ $num != 0 ]; thenecho "开启调试:端口[$num]"declare -x CATALINA_OPTS="-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=$num" fi$CATALINA_HOME/bin/startup.shif [ $? -eq 0 ];thenecho $serviceName" start successfull"elseecho $serviceName" start fail" fi
fi
}stop(){ps aux |grep $CATALINA_BASE/conf |grep -v "grep" >/dev/nullif [ $? -eq 0 ];thenecho  $serviceName" is running"echo "now start stop "$serviceName$CATALINA_HOME/bin/shutdown.shtomcatpid=$(ps aux |grep $CATALINA_BASE/conf |grep -v "grep"|awk '{print $2}')if [ x"$tomcatpid" != x ]; thenkill -9 $tomcatpidfiecho $serviceName" already stoped"elseecho $serviceName" is stoped"fi
}log(){if [ $num != 0 ]; thentail -n $num $CATALINA_BASE/logs/catalina.outelsetail -f $CATALINA_BASE/logs/catalina.outfi
}errlog(){if [ $num != 0 ]; thentail -n $num $CATALINA_BASE/logs/catalina.out |grep Exceptionelsetail -f $CATALINA_BASE/logs/catalina.out |grep Exceptionfi
}status(){ps aux |grep $CATALINA_BASE |grep -v "grep" >/dev/nullif [ $? -eq 0 ];thenecho  $serviceName" is running"elseecho $serviceName" is stoped"fi
}# See how we were called.usage()
{echo "Usage: $1{服务名称} $2 {start|stop|restart|status|log|errlog}"RETVAL="2"
}case "$2" instart)start;;stop)stop;;restart)stopstart;;status)status;;log) log ;;errlog) errlog ;;*)usage;;
esacexit $RETVAL

把脚本放到我们自己自定义命令的目录下

2.在任意目录下可以访问:

我们可以选择使用软连接的方式

#ln -s /opt/tomcat/tomcat.sh /usr/sbin/tomcat

到这里,  你就可以在任意目录下 使用  tomcat 命令了

到这里我们使用Tab键,只能补全对应文件夹下的文件,不满足我们的要求

3.编写bash_completion脚本:

_tomcat()
{local cur prev serviceNames commandsCOMPREPLY=()cur="${COMP_WORDS[COMP_CWORD]}"prev="${COMP_WORDS[COMP_CWORD-1]}"serviceNames=$(ls /opt/tomcat/x_install/  |grep Service)commands='start stop restart status log errlog'serviceNames_str=`echo ${serviceNames[@]} | sed 's/ /\n/g'| sort -u`if ((COMP_CWORD == 1)); thenCOMPREPLY=( $(compgen -W "${serviceNames_str[*]}" -- $cur) )fiif ((COMP_CWORD == 2)); thenCOMPREPLY=( $(compgen -W "${commands[*]}" -- $cur) )fi
}
complete -F _tomcat tomcat

4. 切换目录

#cd /etc/bash_completion.d

上传脚本文件 tomcat.bash

5. 生效自动补全脚本

#source /usr/share/bash-completion/bash_completion

6. 这时就可以自动提示我们的命令了

tomcat 命令后  第一个参数会提示指定目录的文件夹,在自定脚本中设置的serviceNames

第二个参数会提示需要的命令

详解:

_tomcat   定义函数名

cur="${COMP_WORDS[COMP_CWORD]}"       我们正在输入的词

prev="${COMP_WORDS[COMP_CWORD-1]}"    命令中上一个词

serviceNames  存放我们需要自动补全的服务(文件夹名称)

commands   可以使用的命令集合

COMP_CWORD  第几个词

COMPREPLY=( $(compgen -W "${serviceNames_str[*]}" -- $cur) )  输出或自动补全

complete -F _tomcat tomcat    指定当命令为tomcat时,使用_tomcat 补全命令

linux自定义自动补全命令相关推荐

  1. 使用Linux自定义自动补全命令完善自己的shell脚本

    对于Linuxer来说,自动补全是再熟悉不过的一个功能了.当你在命令行敲下部分的命令时,肯定会本能地按下Tab键补全完整的命令,当然除了命令补全之外,还有文件名补全. Bash-completion ...

  2. linux命令补全包安装,RED HAT LINUX bash 自动补全命令安装

    RHEL / CentOS 怎么启用bash命令自动补齐功能呢?请看下面 准备工作:系统镜像,配置好yum源. 1.首先需要安装bash-completion 包:[root@server src]# ...

  3. TeXworks自定义自动补全功能

    2021年1月25日更新: 经过这些年对Sublime Text3, VSCode, TeXStudio写LaTeX文件的摸索,非常建议放弃原教旨主义的TeXWorks,使用TeXStudio.TeX ...

  4. 如何配置MAC的终端自动补全命令行

    我相信有很多小伙伴之前在使用windows系统的时候一定喜欢使用键盘的"Tab"按键来自动补全命令行.这一点MAC可以实现,不过需要进行配置,具体的配置过程如下: 1.打开终端,输 ...

  5. linux自动补全命令插件,vim自动补全插件snipMate

    linux下安装vim自动补全插件snipMate 环境:ubuntu 下载snipMate 官方网站:http://www.vim.org/scripts/script.php?script_id= ...

  6. linux 函数自动补全,Shell脚本中实现自动补全功能

    对于Linuxer来说,自动补全是再熟悉不过的一个功能了.当你在命令行敲下部分的命令时,肯定会本能地按下Tab键补全完整的命令,当然除了命令补全之外,还有文件名补全. Bash-completion ...

  7. Ros无法自动补全命令的解决

    在Linux系统中新安装的Ros环境,发现shell自动补全功能不好使,有的时候不太方便. 需要安装bash-completion和rosbash 解决办法 helloRos@ubuntu:slam$ ...

  8. linux python自动补全_Linux下在python命令行中自动补全代码(py2、3,centos、ubuntu)...

    每次只在shell中测试少量代码,纯手打也有点麻烦 安装ipython也可以实现这个功能,不过破机子有时候反映会稍微卡顿,比较麻烦 1.不管有没有这个文件,直接打开这个文件 vi ~/.pystart ...

  9. Bash、Terminal通过tab忽略大小写自动补全命令行提示

    cd ~ touch .inputrc echo 'set completion-ignore-case on' >> .inputrc echo 'set show-all-if-amb ...

  10. linux下自动补全问题: autocomplete sh: ( compgen -d — ” ): No such file or directory

    autocomplete sh: <( compgen -d - " ): No such file or directory http://www.dansketcher.com/2 ...

最新文章

  1. 建立一个php 基础类
  2. android contentresolver权限,求助关于getcontentresolver().query()
  3. Python3不存在reduce函数
  4. 从assemblyer Instructure deepth understander C principle
  5. 从无到有算法养成篇-链式存储结构之循环链表
  6. Anaconda中Jupyter notebook打开后闪退问题解决方法
  7. S4 KNUMH的设计原理
  8. datatables 配套bootstrap3样式使用小结(1)
  9. Atitit ioc 之道 attilax著 第2章 装配Bean 33 2.1 Spring配置的可选方案 34 2.2 自动化装配bean 35 2.2.1 创建可被发现的bean 35 2.
  10. ES6、7学习笔记(尚硅谷)-6-形参默认值的设置
  11. php如何识别flac文件,flac是什么格式
  12. Coreset-Based Neural Network Compression简记
  13. 千兆光纤 GBIC和SFP接口规格介绍
  14. 迷失在森林里的小女孩
  15. 最近超火的公司前端面试题
  16. 时光机穿梭(管理修改)
  17. spss对数据进行因子分析
  18. win10怎么录屏?windows自带录屏功能怎么用
  19. 链栈的基本操作-C语言
  20. linux运行python程序

热门文章

  1. NOJ [F] 懒惰的风纪委Elaine 求一堆数能组成多少个数小于等于n
  2. wps怎么把两张图片组合_如何对word/wps中的多个图片进行组合。 专家详解
  3. 计算机 64虚拟内存设置方法,win7 64位系统虚拟内存设置及虚拟内存太小的影响...
  4. Jenkins容器由于虚拟内存不足导致的异常退出
  5. python实现pdf转换成图片
  6. PTA(类和对象)用java写 7-2 定义商品类,封装成员变量,输出对象
  7. MacBook Pro 触摸板手势突然失效的解决方案
  8. 通过V90PN通讯故障实例来看线路干扰与线路错误的区别
  9. 软件测试技术课后习题:第9章软件测试自动化-广东高等教育出版社,主编杨胜利
  10. Word转成PDF后目录出现未定义书签是怎么回事