linux如何设置tab补全命令,Ubuntu下命令TAB自动补全 complete使用
前言
在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使用相关推荐
- linux打开ppt文件命令,ubuntu下命令行打开pdf/doc/ppt文件
CoreGraphics-线段常见属性及渲染模式介绍 线段常见属性: 1.线宽 2.线头样式 3.接头样式 4.颜色(包括描边颜色和填充颜色) override func draw(_ rect: C ...
- Ubuntu 下无法Tab键自动补全功能解决办法
在Ubuntu下 使用Tab键报错:cannot create temp file for here-document: no space left on device 解决: rm -rf /var ...
- linux运行java程序引用jar包,ubuntu下java 命令行引用jar包的方法
推荐文章 Ubuntu常用快捷键总结 桌面常用快捷键 Alt + F1:聚焦到桌面左侧任务导航栏,可按上下键进行导航 Alt + F2:运行命令 Alt + F4:关闭当前窗口 Alt + Tab:切 ...
- linux命令行 teamview,Ubuntu下命令行方安装TeamViewer
分享Ubuntu下命令行方安装TeamViewer的过程,供参考,希望对大家有所帮助. 第一步: 下载 安装包 第二步: 执行命令 ## 不加sudo 会提示照片中的错误:dpkg:error:req ...
- linux命令刻盘,Ubuntu下命令行刻录CD和DVD
Ubuntu下命令行刻录CD和DVD 发布时间:2008-02-03 01:41:19来源:红联作者:furshow 开始都用K3b来着,但是由于Ubuntu默认的Gonme桌面,K3b不怎么稳定,加 ...
- Ubuntu下命令行加速、终端加速、命令行代理的方法/proxychains安装与使用
Ubuntu下命令行加速.终端加速.命令行代理的方法/使用proxychains 前提:已经安装并配置好代理/FQ工具. 实现方法:通过安装配置proxychains4实现,即是将任何程序和代理工具的 ...
- emacs c语言 自动补全,Emacs 与 C/C++ 代码自动补全
基于 Emacs 的 company 模式并配合 semantic 文法分析器,实现 Emacs 的 C/C++ 代码自动补全. 关于 Emacs 的代码自动补全 代码自动补全的功能,对于使用 Ema ...
- ubuntu 下命令行播放器mplayer 使用详解
ubuntu 下命令行播放器mplayer 使用详解 2011-01-02 21:00:42| 分类: Linux/Unix | 标签: |
- linux命令行下命令参数前的一横(-)和两横(--)的区别
linux命令行下命令参数前的一横(-)和两横(--)的区别 原文转自:http://blog.csdn.net/songjinshi/article/details/6816776 在解释这些区别之 ...
- ubuntu下命令行输入 sudo: ./xxx.sh:找不到命令
ubuntu下命令行输入 sudo: ./xxx.sh:找不到命令 在命令行中运行sudo ./xxx.sh时遇到问题----找不到命令 解决办法: 右击xxx.sh文件,打开属性--->权限- ...
最新文章
- UiBot带你两分钟看懂RPA是什么
- ATL CLR MFC Win32 常规 的区别
- 在运行期通过反射了解JVM内部机制
- 3、MySQL二进制日志(Binary Log)详解
- 为什么接口需要加密传输
- 【学习笔记】线性规划与对偶问题和LP对偶费用流([ZJOI2013]防守战线题解)
- 基于物品的协同过滤推荐算法——读“Item-Based Collaborative Filtering Recommendation Algorithms”
- Wide-Baseline Image Matching Using Line Signatures
- 人工智能凉凉了?中国 AI 人才缺口高达 12113 个!
- 数据结构—线索二叉树
- 深度学习优化算法大全系列1:概览
- 基础练习 回文数 C语言
- 微时刻视频创意小视频广告怎么制作下载?
- web前端作业--响应式美食菜谱网页设计(HTML+CSS+JavaScript+)实现
- 2022广东省安全员B证第四批(项目负责人)上岗证题目及在线模拟考试
- 从零开始带你称为MySQL实战优化高手(儒猿技术窝)
- 1054:分数加减法
- URAL 1998 The old Padawan
- 【日志】20220414
- 神器 Markmap