IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    使用Bash中Complete自动补全命令

    admin发表于 2013-12-25 11:35:47
    love 0

    大家在Linux下都用shell的TAB自动补全功能,非常方便,但是有时自己开发程序,可能需要自定义实现TAB自动补全功能,这时可能就会用到complete命令来实现对命令的自定义补全,本文主要介绍complete的用法,下一篇会着重介绍对ssh的自动补全的实现。

    入门

    首先先看一个非常简单的例子:

    $ # Create a dummy command:
    $ touch ~/bin/myfoo
    $ chmod +x ~/bin/myfoo
    
    $ # Create some files:
    $ touch a.bar a.foo b.bar b.foo
    
    $ # Use the command and try auto-completion.
    $ # Note that all files are displayed:
    $ myfoo 
    a.bar a.foo b.bar b.foo
    
    $ # Now tell bash that we only want foo files.
    $ # This command tells bash args to myfoo are completed
    $ # by generating a list of files and then excluding
    $ # everything # that doesn't match *.foo:
    $ complete -f -X '!*.foo' myfoo
    
    $ # Tray again:
    $ myfoo 
    a.foo b.foo
    
    • 首先自定义了command: myfoo,  然后测试对myfoo的自动补全功能,默认情况下,myfoo会自动列出当前目录的文件作为自动补全
      内容
    • complete -f -X ‘!*.foo’ myfoo : 使用complete命令对myfoo自定义补全功能,参数含义:-f 是列出当前的文件 -X pattern 将符合pattern条件的文件exclude,这里主要是显示*.foo的文件,将*.bar文件排除在外

    complete参数详解

    complete [-abcdefgjksuv] [-o comp-option] [-A action] [-G globpat] [-W wordlist] [-P prefix] [-S suffix] [-X filterpat] [-F function] [-C command] name [name ...]
    
    • -W wordlist: 自动补全使用的wordlist, 使用IFS分割,会和当前用户输入的Word做前缀比较,提示那些匹配的word list.
    • -S suffix: 向每个自动补全word后添加suffix 后缀.
    • -P prefix: 向每个自动补全word后添加prefix 前缀.
    • -X filterpat: 对于文件名,将匹配pattern的文件名从completion list中移除(exclude), pattern中使用!表示否定
    • -G globpat: 对于文件名,将匹配pattern的文件名作为可能的completion. 与-X刚好相反,-X “!*.foo” 与 -G “*.foo”作用相同
    • -C command: 将command命令的执行结果作为可能的completion.
    • -F function: 执行shell function,在function中对COMPREPLY这个数组复制,作为可能的completion
    • -p [name]: 打印当前自定义的complete
    • -r [name]: 删除当前自定的complete
    • -A action : 表示生成可能的completion的方式,包括alias, file, directory等,具体请参看文后的参看资料

    使用样例

    • 使用-C -G -X参数
      complete -C "pwd" ls  # ls的自动补全为当前目录
      complete -G "*.py" ls # ls的自动补全为.py文件
      complete -X "*.py" ls # ls的自动补全为非.py文件
      
    • 使用-F 参数自定义补全函数
      function _mycomplete_()
      {
          local cmd="${1##*/}"  # 当前命令
          local word=${COMP_WORDS[COMP_CWORD]}  #当前输入的字符串
          local line=${COMP_LINE}  #整行字符串
          local xpat='*.py'  # pattern
          # 根据word的值来补全当前非.py的文件file.
          COMPREPLY=($(compgen -f -X "$xpat" -- "${word}"))
      }
      # _mycomplete_函数可定义在.bash_profile中,然后执行
      source ~/.bash_profile
      # 当然也可多个命令共用一个function, 只要_myfunction_作区分即可,比如对cmd执行case语句
      # 生成不同的xpat
      
      complete -F _mycomplete_ myfoo  #使用_mycomplete 作为myfoo的自动补全
      

    参考资料

    • http://linux.about.com/library/cmd/blcmdl1_complete.htm
    • http://www.linuxjournal.com/content/more-using-bash-complete-command

    您可能对下面文章也感兴趣:

    • Linux中关于Cache Memory的介绍
    • [shell学习笔记]sort、uniq、cut、paste和split用法详解
    • 关于pthread_cond_wait使用while循环判断的理解
    • linux通过Shell获得本机ip地址方法
    • 定时备份网站代码与数据的shell工具


沪ICP备19023445号-2号
友情链接