`
marlonyao
  • 浏览: 252705 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自定义Bash自动完成

    博客分类:
  • Bash
阅读更多
Bash的自动完成功能很爽,它不知道免掉我多少记忆的负担,节约了多少键盘操作。 但是对于我们自己写的脚本也能够利用它的自动完成功能吗?回答是肯定的。下面以几个例子来说明。

程序员需要记忆很多东西,bash, vi, screen, svn都有很多命令和快捷键,偏偏我的记忆力不行,不时查看cheatsheet,每次都cd到某个目录,从一大堆文件中找到那个文件,然后再打开,这个过程显然很烦琐。所以我写了一个脚本,叫做quickref,它接收一个参数,例如bash, vi,然后就会打开对应的cheatsheet。
quickref:
#!/bin/bash

case $1 in
	bash)
		exo-open ~/dropbox/cheatsheets/bash/bash_cheat_sheet.pdf
		;;
	vi)
		exo-open ~/dropbox/cheatsheets/vi_cheat_sheet.pdf
		;;
	# more...
esac

exo-open是xubuntu下的命令,它自动用文件关联的应用程序打开, 例如, pdf文件就会用evince打开。ubuntu下对应的命令是gnome-open。

如果只有bash, vi的cheatsheet,一切不成问题,但是当列表越来越长,问题就来,你不知道你的命令能够接受哪些参数,输入命令时你得考虑,我该输入什么呢?可能还得来回折腾几次,最坏的情况,你可能需要查看源代码才能确定你到底能输入什么。你可以将它们显示在出错消息中,这样可以节省一些功夫,但总不太好。我们可以利用Bash的自动完成功能,我不再担心会输入错误。

我们直接来看怎么做,建立一个文件quickref_completion, 输入以下内容:
_quickref_completion()
{
	local cur
	COMPREPLY=()
	cur=${COMP_WORDS[COMP_CWORD]}
	COMPREPLY=($( compgen -W 'bash vi' -- $cur ))

	return 0
}
complete -F _quickref_completion quickref

然后执行命令". quickref_complection",然后再在bash下输入"quickref ",然后再按Tab(或许得按两次Tab),你会发现bash自动列出所有匹配的結果,下面是我的机器上的显示結果:
$ quickref
bash  vi
$ quickref

怎么实现的呢?其实很简单,_quickref_completion函数用来完成主要的功能,前三行用来得到用户当前的输入,全部补全的結果放在COMPREPLY数组中。这里补全的功能由compgen命令来完成,它完成的功能就是从单词列表中选出匹配给定前缀的所有单词,你最后在命令行下测试一下:
$ compgen -W "find fine hello"
find
fine
hello
$ compgen -W "find fine hello" fi
find
fine

最后complete命令用来注册自动补全函数,第一个参数就是自动补全的函数,后面的参数是应用这个补全函数的所有命令。执行quickref_completion的操作最好放在bashrc中去。

再一个例子,我经常用到命令"sudo apt-get install"命令,所以我给它定义了一个别名:"alias pkginstall='sudo apt-get install'",但这样不好的是,你不能再利用apt-get install的自动完成功能。另外我也定义了别名"alias pkgremove='sudo apt-get remove", 我为它们写了自动补全的函数:
_pkginstall_completion()
{
	local cur

	COMPREPLY=()
	cur=${COMP_WORDS[COMP_CWORD]}
	COMPREPLY=( $( apt-cache pkgnames -- $cur ) )
}
complete -F _pkginstall_completion pkginstall

_pkgremove_completion()
{
	local cur

	COMPREPLY=()
	cur=${COMP_WORDS[COMP_CWORD]}
	COMPREPLY=( $( dpkg -l | awk '{ print $2 }' | grep "^${cur}" ) )
}
complete -F _pkgremove_completion pkgremove

代码就不再解释了,很简单,至于用到的命令,不熟悉的在命令行下试试就知道了。

当然这里所介绍的只是十分简单,但于我已经够用了,至少到目前为止是这样。但要完成更加复杂的功能,例如对于不同的选项,使用不同的命令完成,例如apt-get install和apt-get remove的自动补全就不一样,你可能需要参考其它文章。/etc/complete.d/目录下有很多补全函数的实现,你可以拿来看一下。也可能参考官方文章Programmable-Completion.
分享到:
评论

相关推荐

    linux-gittify一个多彩的Bash提示符自定义的Git别名

    为了提高效率和用户体验,许多用户会选择自定义Bash提示符(Prompt)以显示更多有用的信息。`gittify`就是这样一个工具,它为Bash提供了一个多彩、信息丰富的提示符,并且还包含了一些自定义的Git别名,使得Git操作...

    oh_my_bash:自定义 bash 显示信息的方式。 添加 git 分支名称和状态

    6. **自动完成**:`oh_my_bash` 提供增强的自动完成功能,可以提高命令行操作的效率。例如,它可以自动完成文件名、目录名、Git 命令等。 7. **其他实用工具**:`oh_my_bash` 包含一些额外的脚本和函数,如快速切换...

    Android,Bash,终端,Term

    3. 安装完成后,输入`bash`命令来启动Bash Shell。 Bash与sh的主要区别在于其扩展特性。Bash支持函数、命令别名、历史记录、shell脚本等特性,这些都是sh所不具备的。例如,你可以创建一个简单的Bash脚本来自动化...

    Bash4.0参考文档.zip

    Bash4.0改进了自动补全功能,允许用户自定义补全规则,提高命令输入效率。 综上所述,"Bash4.0参考文档.pdf"涵盖了Bash Shell的各个方面,无论是新手入门还是经验丰富的用户,都能从中获取有价值的信息,提升对Bash...

    bash/shell教程chm版

    3. **命令补全**: Bash支持命令和文件名的自动补全功能,只需输入部分命令或文件名,然后按Tab键,系统会自动完成剩余部分。 4. **环境变量**: Bash中环境变量存储系统级别的配置信息,如PATH变量用于定义命令查找...

    Bash的特性介绍BashInfo

    Bash支持命令和文件路径的自动补全,只需按下Tab键即可完成补全操作,极大地提高了命令输入的效率。 ##### 3. 别名支持 用户可以自定义别名,以简化常用命令的输入。例如,可以通过`alias ll='ls -l'`来定义一个...

    bash-completion-2.1-6.el7.noarch.rar

    当你在命令行输入一部分命令后,按一次Tab键,bash-completion将尝试自动完成你正在输入的单词。如果存在多个可能的选项,再次按下Tab键,bash-completion会列出所有可能的选择。此外,bash-completion还可以处理...

    Advanced Bash Shell Guide

    - 命令补全功能允许用户在输入时按Tab键自动完成文件名、路径或命令,极大地提高了输入效率。 2. **shell别名和函数** - 别名允许用户为常用命令设置简写,例如`alias ll='ls -l'`。 - 函数可以封装一系列命令,...

    vautocomplete一个Vuejs的输入自动完成组件

    在 Vue 应用中,我们经常需要实现输入框的自动完成功能,以便用户可以更快捷地找到他们想要输入的内容。这就是 `v-autocomplete` 组件的用武之地。 `v-autocomplete` 是一个专门为 Vue.js 设计的输入自动完成组件,...

    Bash新手指南 中文 新手必看

    - **Tab补全**:按Tab键可以自动完成命令或文件名,提高输入效率。 ### 4. Bash脚本基础 - **注释**:以#开头的行被视为注释。 - **变量**:用于存储数据,声明时不指定类型。 - **赋值**:`变量名=值`,等号两侧...

    bash 源代码

    Bash不仅是一个命令语言解释器,还提供了功能丰富的编程环境,使得用户能够编写复杂的脚本来自动化任务、进行系统管理或开发自定义的工具。 ### 关于Bash Bash是GNU项目的一部分,由Brian Fox在1989年创建,旨在...

    MsysGit (Git Bash )

    2. **配置Git**:安装完成后,首次打开Git Bash时,系统会提示设置用户的名字和邮箱,这是Git的基本配置,用于标识提交的作者信息。 3. **设置PATH环境变量**:为了让Git命令在任何地方都能被调用,需要将Git的bin...

    bash-completion-tutorial:bash完成教程的代码

    其中,`bash-completion` 是一个非常实用的功能,它能帮助用户自动完成命令、选项以及文件名输入,极大地提高了命令行操作的效率。本教程将深入探讨 `bash-completion` 的使用和编程。 **1. Bash 完成的基本概念** ...

    安卓系统下的bash shell,ssh服务器,gcc编译器以及vim文本编辑器等

    bash进程会保存其会话中用户曾经执行的命令,以方便用户重复执行某个命令通过bash提供的历史命令文件来持久保存此前执行过的命令,用户由私有历史文件 登陆shell的时候,bash会自动读取~/.bash_history文件中所记录...

    Bash Beginners Guide(中文版) - Machtelt Garrels

    - **文件名扩展**:自动完成文件名。 - **别名**: - **什么是别名**:简化常用命令的方法。 - **建立和消除别名**:如何创建和删除别名。 - **更多Bash选项**: - **显示选项**:如`set -v`显示命令执行过程...

    Laravel开发-artisan-bash-completion-plugin

    Bash的自动补全功能是其一大优点,用户在输入命令时按Tab键,系统会自动完成部分或全部命令,极大地节省了输入时间。 `artisan-bash-completion-plugin`的安装过程如下: 1. 首先,克隆或下载`artisan-bash-...

    Bash Pocket Reference, 2nd Edition(2016)

    - **自定义完成**:介绍了如何为自定义命令设置自动完成功能。 - **内置完成**:列举了一些常用的内置命令及其自动完成规则。 ##### 第十三章:作业控制 - **前台与后台任务**:解释了如何控制任务的前后台运行状态...

    GUI开发示例代码---QTdesigner实现自定义槽函数

    ```bash pyuic5 -o mywindow.py mywindow.ui ``` 这会生成一个名为`mywindow.py`的Python源文件,其中包含了UI的Python表示形式。然而,这个文件仅包含基本的信号-槽连接,对于自定义功能,我们需要在主Python脚本...

Global site tag (gtag.js) - Google Analytics