前言

在Ubuntu的shell命令行中,当输入字符后,按两次Tab键,shell会列出一输入字符打头的所有可用命令,如果匹配的命令只有一个时,按一次Tab键就自动将该命令补齐。

除了命令补全之外,还有路径、文件名、目录名补全,比如使用cd切换到指定的目录和ls查看指定的文件的时候,都是比较好用的。

介绍

一般ubuntu的终端都会提供自动补全的功能,但是不同的终端略有不同,有些系统一装机就使用的是zsh,但是比较老一点的系统用的是bash,SHELL之间的切换可以使用下列命令:

chsh -s /bin/bash

chsh -s /bin/zsh

## 可以查看/bin下的SHELL类型,在切换到自己喜欢的

ls /bin/*sh

在这里主要介绍bash提供的补全功能。另外,当大家使用命令的时候,后面接参数,这个其实也可以进行补全,只要编辑好合适的补全脚本并存入到目录/etc/bash_completion.d下即可。

对于bash来说,使用的是内置的complete命令,用于支持Tab键的自动补全:

type -a complete

complete is a shell builtin

在Ubuntu中,系统会默认安装bash-completion包,其中包含了常用命令的大部分自动补齐脚本,如果想编写其他命令的补全脚本的时候,可以参考目录/etc/bash_completion.d下的文件的内容。

samtools 补齐

作为生信用的比较多的一个软件之一,自动补齐是比较方便的一个操作,所以一般都会提前配置好,如下:

sudo vi /etc/bash_completion.d/samtools

# From https://raw.github.com/arq5x/bash_completion/master/samtools revision e931a8b46d9582672cc506e45ad9b4f4d6fbd743

_samtools()

{

local cur prev opts

COMPREPLY=()

cur="${COMP_WORDS[COMP_CWORD]}"

prev="${COMP_WORDS[COMP_CWORD-1]}"

opts="dict faidx index calmd fixmate

reheader targetcut addreplacerg

markdup collate cat merge mpileup

sort split quickcheck fastq fasta

bedcov depth flagstat idxstats

phase stats flags tview view depad"

case $prev in

samtools)

COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )

;;

esac

return 0

}

complete -F _samtools -o default samtools

添加完以后保存,执行一下. /usr/share/bash-completion/bash_completion,使修改生效;就可以进行测试了,输入samtools vi,在按Tab键,就会自动补齐成samtools view这样的命令,相对比较方便。

git补齐

用的相对多的另外一个命令应该是git,先从git github上把配置好的文件下载下来:

wget https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash

sudo mv git-completion.bash /etc/bash_completion.d/

接下来在个人账号下面配置环境变量文件~/.bashrc,在其中添加如下语句,每次终端启动就会自动加载配置:

if [ -f /etc/bash_completion.d/git-completion.bash ]; then

. /etc/bash_completion.d/git-completion.bash

fi

执行一次. ~/.bashrc,就可以测试git配置是否生效,git cl之后按Tab键,就会自动出来git clone,再在后面git clone --,再按Tab键,就会出现可选的参数等等。

其他程序

针对前面的samtools,我就依样画葫芦,添加了bwa和sambamba两个程序的complete补全脚本:

BWA 补全

sudo vi /etc/bash_completion.d/bwa

_bwa()

{

local cur prev opts

COMPREPLY=()

cur="${COMP_WORDS[COMP_CWORD]}"

prev="${COMP_WORDS[COMP_CWORD-1]}"

opts="index aln samse sampe

bwasw fastmap mem fa2pac pac2bwt

pac2bwtgen bwtupdate

bwt2sa"

case $prev in

bwa)

COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )

;;

esac

return 0

}

complete -F _bwa -o default bwa

sambamba补全

sudo vi /etc/bash_completion.d/sambamba

_sambamba()

{

local cur=${COMP_WORDS[COMP_CWORD]}

local subcommand=${COMP_WORDS[1]}

if [[ $COMP_CWORD == 1 ]]; then

COMPREPLY=( $(compgen -W "view index merge sort \

flagstat slice markdup \

depth mpileup validate \

subsample" -- $cur) )

compopt +o nospace

elif [[ $cur == -* ]]; then

case "$subcommand" in

view)

COMPREPLY=( $(compgen -W "-F -f -h -H -I -c -S -p \

-l -o -t -s --filter= --header \

--format= --with-header --count \

--reference-info --show-progress \

--sam-input --output-filename= \

--nthreads= --compression-level= \

--subsample= --subsampling-seed=" -- $cur) )

;;

index)

COMPREPLY=( $(compgen -W "-p -t --nthreads= --show-progress" -- $cur) )

;;

merge)

COMPREPLY=( $(compgen -W "-p -t --nthreads= -l -H --header \

--compression-level=" -- $cur) )

;;

sort)

COMPREPLY=( $(compgen -W "-m --memory-limit= --tmpdir= -o --out \

-n --compression-level= -u -p -t \

--uncompressed-chunks --show-progress \

--nthreads=" -- $cur) )

;;

flagstat)

COMPREPLY=( $(compgen -W "-t -p --nthreads= --show-progress" -- $cur) )

;;

slice)

COMPREPLY=( $(compgen -W "-o --output-filename=" -- $cur) )

;;

markdup)

COMPREPLY=( $(compgen -W "-r -t -l -p --tmpdir= --remove-duplicates \

--nthreads= --compression-level= \

--show-progress" -- $cur) )

;;

subsample)

COMPREPLY=( $(compgen -W "--type --max-cov -o --output -r --remove" -- $cur) )

;;

depth)

COMPREPLY=( $(compgen -W "-F -o -t -c -C -q -a -m -L -z -L -T -w -T --filter --output-file --nthreads --min-coverage --max-coverage --min-base-quality --annotate --fix-mate-overlaps --regions --report-zero-coverage --cov-threshold --window-size --cov-threshold" -- $cur) )

;;

mpileup)

COMPREPLY=( $(compgen -W "-L --regions -o --output-filename --tmpdir -t --nthreads -b --buffer-size -B --output-buffer-size" -- $cur) )

;;

esac

if [[ ${#COMPREPLY[@]} == 1 && ${COMPREPLY[0]} != "--"*"=" ]] ; then

compopt +o nospace

fi

elif [[ ${COMP_WORDS[COMP_CWORD - 2]} == "--format" || ${COMP_WORDS[COMP_CWORD - 1]} == "-f" ]]; then

COMPREPLY=( $(compgen -W "sam bam json msgpack" -- $cur) )

compopt +o nospace

elif [[ $subcommand == "view" || $subcommand == "slice" ]]; then

for word in ${COMP_WORDS[@]}; do

if [[ $word == *.bam && $word != "" ]]; then

eval abspath=$word

COMPREPLY=( $(sambamba view -H -t4 $abspath | grep @SQ | \

cut -f 2 | cut -f2 -d: 2>/dev/null | grep "^$cur") )

break

fi

done

if [[ ${#COMPREPLY[@]} == 0 ]]; then

compopt +o nospace

fi

compopt -o default

compopt -o filenames

else

compopt +o nospace

compopt -o default

fi

}

complete -o nospace -F _sambamba sambamba

在这里修改一下~/.bashrc文件,使得终端启动就可以使用这些自动补全:

vi ~/.bashrc

# enable programmable completion features (you don't need to enable

# this, if it's already enabled in /etc/bash.bashrc and /etc/profile

# sources /etc/bash.bashrc).

if [ -f /etc/bash_completion ] && ! shopt -oq posix; then

. /etc/bash_completion

fi

重新source一下~/.bashrc以后就可以了加载更新的配置了。

常用命令

在上面的这写例子中,使用的是三个shell函数:complete、compgen和compopt,下面介绍一下这三个函数。

complete

complete是补全命令中最核心的命令,指定如何对各个名称进行补全。列出一些常用的参数:

-F function 执行 shell 函数,函数中生成COMPREPLY作为候选的补全结果

-C command 将 command 命令的执行结果作为候选的补全 结果

-G pattern 将匹配 pattern的文件名作为候选的补全结果

-W wordlist 分割 wordlist 中的单词,作为候选的补全结果

-p [name] 列出当前所有的补全命令

-r [name] 删除某个补全命令

-D [name] 其后的选项和动作应用到默认补全,之前未定义的补全命令被补全

可以通过-o设置一些选项,常用的有:

bashdefault 如果没有生成补全条目,就使用bash默认的其它补全

default 如果没有生成补全条目,就使用“readline”默认的文件名补全

nospace 默认会自动填充一个空格,可以通过该参数关闭

filenames 在补全的时候会具体到文件,而不是目录,对于文件补齐比较有用

dirnames 如果没有生成补全条目,就进行目录名补全

noquote 告诉“readline”不引用文件名,默认会进行引用

plusdirs 生成补全条目之后,还会进行目录名补全并把结果添加到其它动作得到的结果中

部分例子:

$ complete -W 'com1 com2 com3 lunar' testm

$ testm

com1 com2 com3 lunar

$ complete -p | grep testm

complete -W 'com1 com2 com3 lunar' testm

$ complete -r testm

$ complete -p | grep testm

compgen

筛选命令,用来筛选生成匹配单词的候选补全结果,根据option生成与word可能匹配的补全:

compgen [option] [word]

## 单词匹配

$ compgen -W 'com1 com2 com3 lunar' -- c

com1

com2

com3

## 匹配当前路径下的文件名和目录名

$ compgen -f -- R

R

README.kegg

compopt

compopt命令修改每个名称指定的补全选项,如果没有指定名称则修改当前执行的补全的选项,如果也没有指定选项,则显示每个名称或当前补全所用的选项。选项可能的取值就是上面的内建命令complete的有效选项。

compopt [-o option] [-DE] [+o option] [name]

+o option 启用 option 配置

-o option 弃用 option 配置

补全变量

在sambamba的补全脚本中,还使用了一些shell内置的补全变量,介绍一下:

COMP_WORDS 数组 存放当前命令行中输入的所有单词

COMP_CWORD 整数 当前输入的单词在 COMP_WORDS 中的索引

COMPREPLY 数组 候选的补全结果

COMP_LINE 字符串 当前的命令行输入字符

COMP_POINT 整数 光标在当前命令行的哪个位置

GATK自动补全

GATK的Tool太多了,每次都不一定能很好的找到,在gatk的目录下面发现了一个好东西:

ls /home/luna/Desktop/Software/gatk/gatk-4.1.8.1/gatk-completion.sh

echo "source /home/luna/Desktop/Software/gatk/gatk-4.1.8.1/gatk-completion.sh" >> ~/.bashrc

稍微测试了一下,还是比较好用的,就是太卡了,应该是我服务器负载太高的原因,大家可以测试一下,虽然这个功能还是处于Beta阶段。

参考

—— dulunar 后记于 2020.07

linux如何设置tab补全命令,Ubuntu下命令TAB自动补全 complete使用相关推荐

  1. linux打开ppt文件命令,ubuntu下命令行打开pdf/doc/ppt文件

    CoreGraphics-线段常见属性及渲染模式介绍 线段常见属性: 1.线宽 2.线头样式 3.接头样式 4.颜色(包括描边颜色和填充颜色) override func draw(_ rect: C ...

  2. Ubuntu 下无法Tab键自动补全功能解决办法

    在Ubuntu下 使用Tab键报错:cannot create temp file for here-document: no space left on device 解决: rm -rf /var ...

  3. linux运行java程序引用jar包,ubuntu下java 命令行引用jar包的方法

    推荐文章 Ubuntu常用快捷键总结 桌面常用快捷键 Alt + F1:聚焦到桌面左侧任务导航栏,可按上下键进行导航 Alt + F2:运行命令 Alt + F4:关闭当前窗口 Alt + Tab:切 ...

  4. linux命令行 teamview,Ubuntu下命令行方安装TeamViewer

    分享Ubuntu下命令行方安装TeamViewer的过程,供参考,希望对大家有所帮助. 第一步: 下载 安装包 第二步: 执行命令 ## 不加sudo 会提示照片中的错误:dpkg:error:req ...

  5. linux命令刻盘,Ubuntu下命令行刻录CD和DVD

    Ubuntu下命令行刻录CD和DVD 发布时间:2008-02-03 01:41:19来源:红联作者:furshow 开始都用K3b来着,但是由于Ubuntu默认的Gonme桌面,K3b不怎么稳定,加 ...

  6. Ubuntu下命令行加速、终端加速、命令行代理的方法/proxychains安装与使用

    Ubuntu下命令行加速.终端加速.命令行代理的方法/使用proxychains 前提:已经安装并配置好代理/FQ工具. 实现方法:通过安装配置proxychains4实现,即是将任何程序和代理工具的 ...

  7. emacs c语言 自动补全,Emacs 与 C/C++ 代码自动补全

    基于 Emacs 的 company 模式并配合 semantic 文法分析器,实现 Emacs 的 C/C++ 代码自动补全. 关于 Emacs 的代码自动补全 代码自动补全的功能,对于使用 Ema ...

  8. ubuntu 下命令行播放器mplayer 使用详解

    ubuntu 下命令行播放器mplayer 使用详解 2011-01-02 21:00:42|  分类: Linux/Unix |  标签: |

  9. linux命令行下命令参数前的一横(-)和两横(--)的区别

    linux命令行下命令参数前的一横(-)和两横(--)的区别 原文转自:http://blog.csdn.net/songjinshi/article/details/6816776 在解释这些区别之 ...

  10. ubuntu下命令行输入 sudo: ./xxx.sh:找不到命令

    ubuntu下命令行输入 sudo: ./xxx.sh:找不到命令 在命令行中运行sudo ./xxx.sh时遇到问题----找不到命令 解决办法: 右击xxx.sh文件,打开属性--->权限- ...

最新文章

  1. UiBot带你两分钟看懂RPA是什么
  2. ATL CLR MFC Win32 常规 的区别
  3. 在运行期通过反射了解JVM内部机制
  4. 3、MySQL二进制日志(Binary Log)详解
  5. 为什么接口需要加密传输
  6. 【学习笔记】线性规划与对偶问题和LP对偶费用流([ZJOI2013]防守战线题解)
  7. 基于物品的协同过滤推荐算法——读“Item-Based Collaborative Filtering Recommendation Algorithms”
  8. Wide-Baseline Image Matching Using Line Signatures
  9. 人工智能凉凉了?中国 AI 人才缺口高达 12113 个!
  10. 数据结构—线索二叉树
  11. 深度学习优化算法大全系列1:概览
  12. 基础练习 回文数 C语言
  13. 微时刻视频创意小视频广告怎么制作下载?
  14. web前端作业--响应式美食菜谱网页设计(HTML+CSS+JavaScript+)实现
  15. 2022广东省安全员B证第四批(项目负责人)上岗证题目及在线模拟考试
  16. 从零开始带你称为MySQL实战优化高手(儒猿技术窝)
  17. 1054:分数加减法
  18. URAL 1998 The old Padawan
  19. 【日志】20220414
  20. 神器 Markmap

热门文章

  1. linux日志生成工具,linux系统日志管理工具logrotate之生产实例
  2. 安装elasticsearch遇到的几个问题
  3. 由C向B:社区团购切换比拼赛道?
  4. 使用计算机眼睛保护方法有哪些,使用电脑保护眼睛的方法有哪些
  5. 跨省市跳槽,社保公积金处理办法
  6. 北京市居住证办理问题的整理
  7. 给图片加边框源代码c语言,给图片加框的代码及效果
  8. 工作缺点和不足及措施_个人总结缺点和不足
  9. 中职计算机平面设计主要学什么,四川省计算机平面设计专业学什么
  10. C51最小系统板红外遥控控制小车