`
cwqcwk1
  • 浏览: 87240 次
文章分类
社区版块
存档分类
最新评论

详解Linux命令行自动补全

 
阅读更多
在Linux命令行下,输入字符后,按两次Tab键,shell就会列出以这些字符打头的所有可用命令。如果只有一个命令匹配到,按一次Tab键就自动将这个命令补全。比如,想更改密码,但只记得这个命令前几个字母是pass。这时候,按Tab键,shell就自动输出 passwd 命令,非常方便。

当然,除了命令补全,还有路径、文件名补全。这个在我们 cd 到特定目录时特别好用。

命令补全效果,如下:


那么,自己开发的程序,该怎么实现Tab自动补全?


补全命令说明

自动补全是Bash自带的一个强大的功能,允许通过编码指定命令参数如何补全。通常,补全脚本会放在/etc/bash_completion.d/ 目录下,方便统一启用所有补全脚本。

这里例子的命令为 foo
# cat /etc/bash_completion.d/foo.bash
_foo()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $(compgen -W "exec help test" -- $cur) )
}
complete -F _foo foo

如下,测试foo命令是否自动补全
# chmod +x /etc/bash_completion.d/foo.bash
# source /etc/bash_completion.d/foo.bash
# foo [Tab][Tab]
exec  help  test  
以上,source是为了这个foo.bash在当前会话生效。默认情况下,这个补全脚本不会被执行到,也就是说,补全命令未激活。需要source激活这个脚本,就可以没有顾虑地使用了。

为了避免每次都要source一次,可以在bashrc加上这个命令。

bashrc全局配置在不同 linux 发行版可能位置不同,如下:
Centos /etc/bashrc
Ubuntu /etc/bash.bashrc
(如果只在当前帐号生效,只要配置 ~/.bashrc 即可)
在bashrc文件末尾加上 source /etc/bash_completion.d/foo.bash,这样,每次登录到linux后,就会激活这个补全脚本。


补全命令详解

前面给大家演示的例子,用到两个命令complete和compgen,下面分别介绍这两个命令。

complete (补全命令)

这是命令补全最核心的命令了,来看下这个命令的参数说明。
# help complete
complete: complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-A action] [-G globpat] [-W wordlist]  [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [name ...]
重点说明:
-F function 执行shell 函数,函数中生成COMPREPLY作为候选的补全结果
-C command 将 command 命令的执行结果作为候选的补全 结果
-Gpattern 将匹配 pattern的文件名作为候选的补全结果
-W wordlist 分割 wordlist 中的单词,作为候选的补全结果
-p [name] 列出当前所有的补全命令
-r [name] 删除某个补全命令

演示下:
# complete -W 'word1 word2 word3 test' foo
# foo w<Tab>
# foo word<Tab>
# complete -p
complete -W 'word1 word2 word3 test' foo
complete -o filenames -F __udisks udisks
# complete -r foo
# complete -p
complete -o filenames -F __udisks udisks


compgen(筛选命令)

这个命令,用来筛选生成 匹配单词的 候选补全结果
# help compgen
compgen: compgen [-abcdefgjksuv] [-o option]  [-A action] [-G globpat] [-W wordlist]  [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [word]
重点说明:
-W wordlist 分割 wordlist 中的单词,生成候选补全列表
# compgen -W 'word1 word2 test' 
word1
word2
test
# compgen -W 'word1 word2 test' word 
word1
word2


compopt(修改补全命令设置)

这个命令可以修改补全命令设置,注意了,这个命令必须在补全函数中使用,否则会报错。
# help compopt
compopt: compopt [-o|+o option] [-DE] [name ...]
重点说明:
+o option 启用 option 配置
-o option 弃用 option 配置

例如,设置命令补全后不要多加空格,方法如下:
compopt -o nospace


内置补全变量

除了上面三个命令外,Bash还有几个内置变量来辅助补全功能,如下:
COMP_WORDS 类型为数组,存放当前命令行中输入的所有单词
COMP_CWORD 类型为整数,当前输入的单词在COMP_WORDS中的索引
COMPREPLY 类型为数组,候选的补全结果
COMP_WORDBREAKS 类型为字符串,表示单词之间的分隔符
COMP_LINE 类型为字符串,表示当前的命令行输入字符
COMP_POINT 类型为整数,表示光标在当前命令行的哪个位置


命令行补全实例

下面再结合前面三个补全命令(complete/compgen/compopt)和内置变量,写了例子说明下。
# cat /etc/bash_completion.d/foo.bash 
_foo()
{
    COMPREPLY=()
    local cur=${COMP_WORDS[COMP_CWORD]};
    local cmd=${COMP_WORDS[COMP_CWORD-1]};
    case $cmd in
    'foo')
          COMPREPLY=( $(compgen -W 'help test read' -- $cur) ) ;;
    'test')
          local pro=( $(awk '{print $1}' /data/a.txt) )
          COMPREPLY=( $(compgen -W '${pro[@]}' -- $cur) ) ;;
    '*')
          ;;
    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 _foo foo
例子中, foo有3个参数,分别是 help, read, test
read 测试遍历 /data 目录下所有文件
test 测试从文件中提取2级参数
help 只是演示,没有特殊作用

现在跑下这个例子:
# mkdir /data
# touch /data/a.txt
# touch /data/b.txt
# tree /data
/data
├── a.txt
└── b.txt

0 directories, 2 files
# source /etc/bash_completion.d/foo.bash 
# foo [Tab][Tab]
help  read  test  
# echo world1 >> /data/a.txt
# echo world2 >> /data/a.txt
# foo test world[Tab][Tab]
world1  world2  
# foo read[Tab][Tab]
a.txt  b.txt


参考:
http://blog.csdn.net/mycwq/article/details/52420330
https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion-Builtins.html
http://kodango.com/bash-competion-programming
http://unix.stackexchange.com/questions/55520/create-bash-completion-script-to-autocomplete-paths-after-is-equal-sign
https://devmanual.gentoo.org/tasks-reference/completion/index.html

分享到:
评论

相关推荐

    linux命令行大全.pdf

    在Linux系统中,Shell提供了一组强大的文本处理工具,书中介绍了文件的字符展开、路径名展开、算术表达式展开等展开技巧,以及如何利用命令替换、引用、自动补全等功能,这些都极大地提高了用户的工作效率。...

    快乐的Linux 命令行(中文).zip

    "快乐的Linux 命令行(中文)"这个压缩包显然旨在帮助用户深入理解并熟练掌握Linux命令行操作,这对于系统管理员、开发者或者任何需要在终端进行高效工作的用户来说都是必不可少的。以下是基于这个主题的详细知识...

    Linux命令行.pdf

    - `Tab`: 自动补全命令或参数。 - `Ctrl+C`: 强行终止当前运行的程序。 - `Ctrl+Z`: 将当前运行的程序放到后台,并可以通过 `fg` 命令将其拖回到前台继续执行。 - `Ctrl+A`: 将光标移到行首,类似于Home键的功能...

    实用Linux命令行技巧

    ### 实用Linux命令行技巧详解 #### 一、基本操作 **标题与描述解析:** 在标题“实用Linux命令行技巧”以及描述“本文分享了Linux命令行的一些实用技巧。”中,我们可以理解到文章旨在介绍一系列提高Linux命令行...

    详解Linux命令行快捷键

    9. **Tab**:命令行自动补全功能,当输入部分命令或路径后,按下Tab键,系统会尝试自动完成剩余的部分,大大减少了拼写错误的可能性。 10. **Ctrl+w**:删除光标前的单词,这在修改已输入的命令时非常方便。 11. *...

    python tab 自动补全

    ### Python Tab 自动补全详解 #### 一、Tab 自动补全的重要性 在 Python 开发过程中,Tab 自动补全是提高编码效率的关键工具之一。它可以帮助开发者快速完成代码片段的输入,减少打字错误,并提供语法建议。尤其是...

    linux命令行.pdf

    ### Linux命令行基础知识点概述 #### 一、引言与学习目标 - **为什么使用命令行**:在Linux系统中,命令行界面提供了一种直接、高效的方式来进行系统管理、文件操作以及各种任务的自动化处理。相较于图形用户界面...

    快乐的Linux命令行

    ### 快乐的Linux命令行知识点详述 #### 引言 - **为什么使用命令行**:命令行界面(Command Line Interface, CLI)提供了一种直接、高效的方式与计算机交互,尤其是对于复杂的操作任务而言,其灵活性远超图形用户界面...

    The Linux Command Line命令行.zip

    《Linux命令行详解》 Linux命令行,是Linux操作系统的核心组成部分,对于无论是初学者还是资深用户,掌握其操作技巧都是至关重要的。Linux命令行提供了一种高效、直接的交互方式,使得用户可以通过文本输入指令来...

    Linux Shell命令行及脚本编程实例详解PPT.rar

    Shell脚本中还可能涉及环境变量、位置参数、命令别名、历史记录、命令行补全等功能。 "清华大学出版社推荐图书"表明这份资料具有一定的权威性和教育价值。学习Linux Shell不仅可以提升个人技能,对于在企业环境中...

    linux 命令行

    - **Tab键**: 用于自动补全命令或参数,提高命令行的使用效率。 - **Ctrl+C**: 用于强行终止正在运行的程序。 - **Ctrl+Z**: 将当前运行的程序放到后台,并可以通过输入`fg`命令将其重新拉回到前台继续执行。 - **...

    增强型命令行工具cmder.zip

    4. **自动补全**:Cmder支持命令行自动补全,提高输入效率。 5. **别名功能**:用户可以自定义命令别名,简化常用命令的输入。 6. **路径高亮**:在输入命令时,路径会自动高亮显示,便于快速识别当前目录。 7. *...

    Linux考试题大学Linux考试样题

    - `tab`:命令行自动补全功能。 - `vi`编辑器的三种模式:命令行模式、插入模式和末行模式。 - `wc`:统计文件的字数、字节数和行数。 - `date`:显示和设置系统日期和时间。 - `fdisk`:硬盘分区管理工具。 4...

    pip-bash-completion:pip的bash自动补全

    **pip-bash-completion:为pip提供bash命令行补全** 在Linux或Unix环境中,Bash Shell是一个广泛使用的命令行解释器,它提供了强大的交互式功能。`pip`是Python的包管理工具,用于安装、升级和管理Python库。为了...

    Linux终端命令行的常用快捷键详解

    中间鼠标键或三键鼠标模拟粘贴高亮文本,`Tab` 实现命令行自动补全,上下箭头浏览命令历史,`exit` 注销用户,`history` 查看命令历史。 熟练掌握这些快捷键可以极大地提高Linux终端的使用效率,减少键盘输入量,...

    linux详解.docx

    2. Linux命令行基础 - `shutdown -h now`: 立即关机 - `reboot`: 重启系统 - `cd /`: 进入根目录 - `vi`: 文本编辑器,用于开发和编辑文件 - `gcc`: C语言编译器,用于将C程序编译成可执行文件 - `hello.cpp`: 一个...

    Linux命令详解讲义

    ### Linux命令详解讲义 #### 一、CentOS基本使用 **CentOS**是一种基于**Red Hat Enterprise Linux**(RHEL)源代码重新编译而成的开源操作系统,它旨在提供与RHEL高度兼容且免费的企业级Linux平台。对于初学者来...

    linux-ubuntu基础与命令行学习

    - **命令执行**: 在Linux命令行中,一次通常只执行一条命令。若要连续执行多条命令,可以使用分号`;`隔开。例如,`ls; echo "Hello"`。 - **命令帮助**: 对于大多数命令,可以使用`命令 --help`来获取简要的帮助信息...

    增强型命令行工具cmder

    而`cmder`正是这样一款专为提升命令行体验而设计的增强型工具,它融合了Windows和Linux命令行的优点,为开发者、系统管理员以及热衷于命令行操作的用户提供了一个更加友好和强大的环境。 首先,让我们深入了解`...

    fish-2.1.2

    Fish的一大亮点是它的智能命令行自动补全。它可以根据当前工作目录和已安装的命令,自动完成文件名、命令选项以及参数。这大大提高了命令行操作的效率,减少了输入错误。 **2. 语法高亮** Fish Shell支持命令行语法...

Global site tag (gtag.js) - Google Analytics