bash_completionq强劲的bash参数补全功能

简介:

本文链接:http://codingstandards.iteye.com/blog/796598   (转载请注明出处)


在使用bash命令行时,在提示符下,输入某个命令的前面几个字符,然后按TAB键,就会列出以这几个字符开头的命令供我们选择。不光如此,还可以进行参数补全,但只限于文件参数,当输入到参数部分时,按TAB键,就会列出以这个参数开头的文件路径供我们选择。Bash提供了一个complete内建命令,它的用途是规定参数怎么自动补全(Specify  how arguments to each name should be completed.)。它怎么使用在网上的资料都没怎么看见,man手册页不太想看,但是这个世界好人真的挺多,网站http://www.caliban.org/bash/ 提供了一个称之为bash-completion的软件包,通过一个复杂的脚本bash_completion实现可编程的补全程序,减少系统管理员日常维护工作,减少差错,提高工作效率。

 

常用参数

不用管参数了,只管在输入参数时按TAB键补全了。

使用示例

示例一 安装bash-completion的过程

[root@rhel55 ~]# type -a complete 

complete is a shell builtin   <== complete是一个Bash内建命令 

[root@rhel55 ~]#

[root@rhel55 ~]# cd setup/

下面用wget从 http://www.caliban.org/bash/ 下载源代码的rpm包。 

[root@rhel55 setup]# wget http://www.caliban.org/files/redhat/SRPMS/bash-completion-20060301-1.src.rpm 

--2010-10-28 13:32:20--  http://www.caliban.org/files/redhat/SRPMS/bash-completion-20060301-1.src.rpm

正在解析主机 www.caliban.org... 83.98.221.239

Connecting to www.caliban.org|83.98.221.239|:80... 已连接。

已发出 HTTP 请求,正在等待回应... 200 OK

长度:170596 (167K) [application/x-rpm]

Saving to: `bash-completion-20060301-1.src.rpm'


100%[==========================================================================================>] 170,596     91.0K/s   in 1.8s    


2010-10-28 13:32:23 (91.0 KB/s) - `bash-completion-20060301-1.src.rpm' saved [170596/170596]


[root@rhel55 setup]# ls -l bash-completion-20060301-1.src.rpm 

-rw-r--r-- 1 root root 170596 2006-03-02 bash-completion-20060301-1.src.rpm

[root@rhel55 setup]# rpmbuild --rebuild bash-completion-20060301-1.src.rpm   //yum install rpm-build

Installing bash-completion-20060301-1.src.rpm

warning: InstallSourcePackage: Header V3 DSA signature: NOKEY, key ID bfbaf0e8

warning: user ianmacd does not exist - using root

warning: group ianmacd does not exist - using root

warning: user ianmacd does not exist - using root

warning: group www does not exist - using root

Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.75172

+ umask 022

+ cd /usr/src/redhat/BUILD

+ LANG=C

+ export LANG

+ unset DISPLAY

+ cd /usr/src/redhat/BUILD

+ rm -rf bash_completion

+ /usr/bin/bzip2 -dc /usr/src/redhat/SOURCES/bash-completion-20060301.tar.bz2

+ tar -xvvf -

drwxrwxr-x ianmacd/ianmacd   0 2006-03-02 00:38:44 bash_completion/

drwxrwxr-x ianmacd/ianmacd   0 2006-03-01 18:45:13 bash_completion/contrib/

-rw-r--r-- ianmacd/ianmacd 748 2005-01-03 10:44:22 bash_completion/contrib/sitecopy

-rw-r--r-- ianmacd/ianmacd 261 2003-12-31 16:22:37 bash_completion/contrib/isql

-rw-r--r-- ianmacd/ianmacd 388 2002-06-13 06:03:23 bash_completion/contrib/bitkeeper

-rw-r--r-- ianmacd/ianmacd 442 2004-03-31 06:39:11 bash_completion/contrib/cksfv

-rw-r--r-- ianmacd/ianmacd 3621 2003-12-31 16:22:37 bash_completion/contrib/dsniff

-rw-r--r-- ianmacd/ianmacd 1254 2003-12-31 16:22:37 bash_completion/contrib/freeciv

-rw-r--r-- ianmacd/ianmacd  659 2003-12-31 16:22:37 bash_completion/contrib/gkrellm

-rw-r--r-- ianmacd/ianmacd 1230 2002-08-20 00:57:44 bash_completion/contrib/gnatmake

-rw-r--r-- ianmacd/ianmacd  258 2003-12-31 16:22:37 bash_completion/contrib/harbour

-rw-r--r-- ianmacd/ianmacd 1838 2003-12-31 16:22:37 bash_completion/contrib/larch

-rw-r--r-- ianmacd/ianmacd  163 2003-12-31 16:22:37 bash_completion/contrib/lilypond

-rw-r--r-- ianmacd/ianmacd 1917 2003-12-31 16:22:37 bash_completion/contrib/mcrypt

-rw-r--r-- ianmacd/ianmacd 1024 2004-01-01 08:54:41 bash_completion/contrib/mtx

-rw-r--r-- ianmacd/ianmacd 1164 2003-12-31 16:22:37 bash_completion/contrib/p4

-rw-r--r-- ianmacd/ianmacd 1696 2003-12-31 16:22:37 bash_completion/contrib/povray

-rw-r--r-- ianmacd/ianmacd 2613 2006-02-25 22:25:59 bash_completion/contrib/ri

-rw-r--r-- ianmacd/ianmacd  491 2003-12-31 16:22:37 bash_completion/contrib/unace

-rw-r--r-- ianmacd/ianmacd  608 2004-07-06 07:37:47 bash_completion/contrib/unrar

-rw-r--r-- ianmacd/ianmacd  406 2005-01-03 11:00:44 bash_completion/contrib/snownews

-rw-r--r-- ianmacd/ianmacd 8673 2004-03-31 07:05:34 bash_completion/contrib/mailman

-rw-r--r-- ianmacd/ianmacd  664 2004-03-31 07:05:45 bash_completion/contrib/sbcl

-rw-r--r-- ianmacd/ianmacd  644 2004-03-31 07:05:45 bash_completion/contrib/lisp

-rw-r--r-- ianmacd/ianmacd  669 2004-03-31 07:05:45 bash_completion/contrib/clisp

-rw-r--r-- ianmacd/ianmacd  603 2004-03-31 07:05:45 bash_completion/contrib/gcl

-rw-r--r-- ianmacd/ianmacd 6701 2006-03-01 18:45:03 bash_completion/contrib/svk

-rw-r--r-- ianmacd/ianmacd 2215 2005-07-12 01:49:14 bash_completion/contrib/modules

-rw-r--r-- ianmacd/ianmacd 1038 2004-10-17 16:22:09 bash_completion/contrib/bittorrent

-rw-r--r-- ianmacd/ianmacd 3019 2006-02-26 08:25:41 bash_completion/contrib/hg

-rw-r--r-- ianmacd/ianmacd 17992 2000-07-12 17:40:03 bash_completion/COPYING

-rw-r--r-- ianmacd/ianmacd   799 2003-05-01 13:49:58 bash_completion/BUGS

-rw-rw-r-- ianmacd/ianmacd 184573 2006-03-02 00:39:58 bash_completion/Changelog

-rw-r--r-- ianmacd/ianmacd  17005 2006-02-25 22:41:11 bash_completion/README

-rw-r--r-- ianmacd/ianmacd 215739 2006-03-02 00:20:18 bash_completion/bash_completion

-rwxr-xr-x ianmacd/ianmacd    557 2006-02-25 09:37:15 bash_completion/bash_completion.sh

-rw-r--r-- ianmacd/ianmacd   2528 2006-03-02 00:19:26 bash_completion/TODO

+ STATUS=0

+ '[' 0 -ne 0 ']'

+ cd bash_completion

++ /usr/bin/id -u

+ '[' 0 = 0 ']'

+ /bin/chown -Rhf root .

++ /usr/bin/id -u

+ '[' 0 = 0 ']'

+ /bin/chgrp -Rhf root .

+ /bin/chmod -Rf a+rX,u+w,g-w,o-w .

+ exit 0

Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.75172

+ umask 022

+ cd /usr/src/redhat/BUILD

+ cd bash_completion

+ LANG=C

+ export LANG

+ unset DISPLAY

+ rm -rf /var/tmp/bash-completion-root bash-completion-ghosts.list

+ install -dm 0755 /var/tmp/bash-completion-root/etc/profile.d

+ install -dm 0755 /var/tmp/bash-completion-root/etc/bash_completion.d

+ install -pm 0644 bash_completion /var/tmp/bash-completion-root/etc/

+ sed -e s@/etc@/etc@g /usr/src/redhat/SOURCES/bash_completion.sh

+ touch -r /usr/src/redhat/SOURCES/bash_completion.sh /var/tmp/bash-completion-root/etc/profile.d/bash_completion.sh

+ install -dm 755 /var/tmp/bash-completion-root/usr/share/bash-completion

+ install -pm 644 contrib/bitkeeper contrib/bittorrent contrib/cksfv contrib/clisp contrib/dsniff contrib/freeciv contrib/gcl contrib/gkrellm contrib/gnatmake contrib/harbour contrib/hg contrib/isql contrib/larch contrib/lilypond contrib/lisp contrib/mailman contrib/mcrypt contrib/modules contrib/mtx contrib/p4 contrib/povray contrib/ri contrib/sbcl contrib/sitecopy contrib/snownews contrib/svk contrib/unace contrib/unrar /var/tmp/bash-completion-root/usr/share/bash-completion

+ cd contrib

+ for f in '*'

+ ln -s /usr/share/bash-completion/bitkeeper /var/tmp/bash-completion-root/etc/bash_completion.d

+ echo '%ghost /etc/bash_completion.d/bitkeeper'

+ for f in '*'

+ ln -s /usr/share/bash-completion/bittorrent /var/tmp/bash-completion-root/etc/bash_completion.d

+ echo '%ghost /etc/bash_completion.d/bittorrent'

+ for f in '*'

+ ln -s /usr/share/bash-completion/cksfv /var/tmp/bash-completion-root/etc/bash_completion.d

+ echo '%ghost /etc/bash_completion.d/cksfv'

+ for f in '*'

+ ln -s /usr/share/bash-completion/clisp /var/tmp/bash-completion-root/etc/bash_completion.d

+ echo '%ghost /etc/bash_completion.d/clisp'

+ for f in '*'

+ ln -s /usr/share/bash-completion/dsniff /var/tmp/bash-completion-root/etc/bash_completion.d

+ echo '%ghost /etc/bash_completion.d/dsniff'

+ for f in '*'

+ ln -s /usr/share/bash-completion/freeciv /var/tmp/bash-completion-root/etc/bash_completion.d

+ echo '%ghost /etc/bash_completion.d/freeciv'

+ for f in '*'

+ ln -s /usr/share/bash-completion/gcl /var/tmp/bash-completion-root/etc/bash_completion.d

+ echo '%ghost /etc/bash_completion.d/gcl'

+ for f in '*'

+ ln -s /usr/share/bash-completion/gkrellm /var/tmp/bash-completion-root/etc/bash_completion.d

+ echo '%ghost /etc/bash_completion.d/gkrellm'

+ for f in '*'

+ ln -s /usr/share/bash-completion/gnatmake /var/tmp/bash-completion-root/etc/bash_completion.d

+ echo '%ghost /etc/bash_completion.d/gnatmake'

+ for f in '*'

+ ln -s /usr/share/bash-completion/harbour /var/tmp/bash-completion-root/etc/bash_completion.d

+ echo '%ghost /etc/bash_completion.d/harbour'

+ for f in '*'

+ ln -s /usr/share/bash-completion/hg /var/tmp/bash-completion-root/etc/bash_completion.d

+ echo '%ghost /etc/bash_completion.d/hg'

+ for f in '*'

+ ln -s /usr/share/bash-completion/isql /var/tmp/bash-completion-root/etc/bash_completion.d

+ echo '%ghost /etc/bash_completion.d/isql'

+ for f in '*'

+ ln -s /usr/share/bash-completion/larch /var/tmp/bash-completion-root/etc/bash_completion.d

+ echo '%ghost /etc/bash_completion.d/larch'

+ for f in '*'

+ ln -s /usr/share/bash-completion/lilypond /var/tmp/bash-completion-root/etc/bash_completion.d

+ echo '%ghost /etc/bash_completion.d/lilypond'

+ for f in '*'

+ ln -s /usr/share/bash-completion/lisp /var/tmp/bash-completion-root/etc/bash_completion.d

+ echo '%ghost /etc/bash_completion.d/lisp'

+ for f in '*'

+ ln -s /usr/share/bash-completion/mailman /var/tmp/bash-completion-root/etc/bash_completion.d

+ echo '%ghost /etc/bash_completion.d/mailman'

+ for f in '*'

+ ln -s /usr/share/bash-completion/mcrypt /var/tmp/bash-completion-root/etc/bash_completion.d

+ echo '%ghost /etc/bash_completion.d/mcrypt'

+ for f in '*'

+ ln -s /usr/share/bash-completion/modules /var/tmp/bash-completion-root/etc/bash_completion.d

+ echo '%ghost /etc/bash_completion.d/modules'

+ for f in '*'

+ ln -s /usr/share/bash-completion/mtx /var/tmp/bash-completion-root/etc/bash_completion.d

+ echo '%ghost /etc/bash_completion.d/mtx'

+ for f in '*'

+ ln -s /usr/share/bash-completion/p4 /var/tmp/bash-completion-root/etc/bash_completion.d

+ echo '%ghost /etc/bash_completion.d/p4'

+ for f in '*'

+ ln -s /usr/share/bash-completion/povray /var/tmp/bash-completion-root/etc/bash_completion.d

+ echo '%ghost /etc/bash_completion.d/povray'

+ for f in '*'

+ ln -s /usr/share/bash-completion/ri /var/tmp/bash-completion-root/etc/bash_completion.d

+ echo '%ghost /etc/bash_completion.d/ri'

+ for f in '*'

+ ln -s /usr/share/bash-completion/sbcl /var/tmp/bash-completion-root/etc/bash_completion.d

+ echo '%ghost /etc/bash_completion.d/sbcl'

+ for f in '*'

+ ln -s /usr/share/bash-completion/sitecopy /var/tmp/bash-completion-root/etc/bash_completion.d

+ echo '%ghost /etc/bash_completion.d/sitecopy'

+ for f in '*'

+ ln -s /usr/share/bash-completion/snownews /var/tmp/bash-completion-root/etc/bash_completion.d

+ echo '%ghost /etc/bash_completion.d/snownews'

+ for f in '*'

+ ln -s /usr/share/bash-completion/svk /var/tmp/bash-completion-root/etc/bash_completion.d

+ echo '%ghost /etc/bash_completion.d/svk'

+ for f in '*'

+ ln -s /usr/share/bash-completion/unace /var/tmp/bash-completion-root/etc/bash_completion.d

+ echo '%ghost /etc/bash_completion.d/unace'

+ for f in '*'

+ ln -s /usr/share/bash-completion/unrar /var/tmp/bash-completion-root/etc/bash_completion.d

+ echo '%ghost /etc/bash_completion.d/unrar'

+ cd -

/usr/src/redhat/BUILD/bash_completion

+ /usr/lib/rpm/redhat/brp-compress

+ /usr/lib/rpm/redhat/brp-strip /usr/bin/strip

+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip

+ /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump

+ /usr/lib/rpm/brp-python-bytecompile

+ /usr/lib/rpm/redhat/brp-java-repack-jars

Processing files: bash-completion-20060301-1

Executing(%doc): /bin/sh -e /var/tmp/rpm-tmp.28530

+ umask 022

+ cd /usr/src/redhat/BUILD

+ cd bash_completion

+ DOCDIR=/var/tmp/bash-completion-root/usr/share/doc/bash-completion-20060301

+ export DOCDIR

+ rm -rf /var/tmp/bash-completion-root/usr/share/doc/bash-completion-20060301

+ /bin/mkdir -p /var/tmp/bash-completion-root/usr/share/doc/bash-completion-20060301

+ cp -pr BUGS COPYING README TODO Changelog /var/tmp/bash-completion-root/usr/share/doc/bash-completion-20060301

+ exit 0

Provides: config(bash-completion) = 20060301-1

Requires(interp): /bin/sh /bin/sh

Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1

Requires(pre): /bin/sh

Requires: /bin/sh bash >= 2.05-12 config(bash-completion) = 20060301-1 fileutils grep sed textutils

Checking for unpackaged file(s): /usr/lib/rpm/check-files /var/tmp/bash-completion-root

Wrote: /usr/src/redhat/RPMS/noarch/bash-completion-20060301-1.noarch.rpm

Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.85514

+ umask 022

+ cd /usr/src/redhat/BUILD

+ cd bash_completion

+ rm -rf /var/tmp/bash-completion-root

+ exit 0

Executing(--clean): /bin/sh -e /var/tmp/rpm-tmp.85514

+ umask 022

+ cd /usr/src/redhat/BUILD

+ rm -rf bash_completion

+ exit 0

[root@rhel55 setup]#

使用rpmbuild编译后的rpm包在/usr/src/redhat/RPMS下,找到它,然后安装。

[root@rhel55 setup]# cd /usr/src/redhat/ 

BUILD/   RPMS/    SOURCES/ SPECS/   SRPMS/   

[root@rhel55 setup]# cd /usr/src/redhat/ RPMS/ 

[root@rhel55 RPMS]# find . -name "bash-completion*rpm" 

./noarch/bash-completion-20060301-1.noarch.rpm

[root@rhel55 RPMS]# rpm -ivh ./noarch/bash-completion-20060301-1.noarch.rpm 

Preparing...                ########################################### [100%]

   1:bash-completion        ########################################### [100%]

[root@rhel55 RPMS]# rpm -qa | grep bash 

bash-3.2-24.el5

bash-completion-20060301-1

[root@rhel55 RPMS]# rpm -q bash-completion 

bash-completion-20060301-1

[root@rhel55 RPMS]#

[root@rhel55 RPMS]#

安装成功了,退出重新登录。 

[root@rhel55 RPMS]# exit 

logout

下面的粗体的 TAB 表示按TAB键补全。 

Last login: Thu Oct 28 13:19:28 2010 from 192.168.6.106

[root@rhel55 ~]# grep --TAB 

--after-context=       --count                --fixed-strings        --max-count=           --silent

--basic-regexp         --devices=             --help                 --mmap                 --unix-byte-offsets

--before-context=      --directories=         --ignore-case          --no-filename          --version

--binary               --exclude=             --include=             --no-messages          --with-filename

--binary-files=        --exclude-from=        --invert-match         --null                 --word-regexp

--byte-offset          --extended-regexp      --label=               --null-data            

--color                --file=                --line-buffered        --only-matching        

--colour               --files-with-matches   --line-number          --perl-regexp          

--context=             --files-without-match  --line-regexp          --regexp=              

[root@rhel55 ~]# cvs a TAB 

add       admin     annotate  

[root@rhel55 ~]# cvs a

示例二 在ssh命令后按tab键,bash会根据known_hosts中定义的主机自动补全

[root@web ~]# ssh 1TAB 92.168.6.1TAB 

192.168.6.11  192.168.6.12  

[root@web ~]# ssh 192.168.6.1

 

示例三 在service命令后按tab键,bash会自动根据/etc/init.d中的脚本名称自动补全

注意输入service命令之后输入空白再按TAB键,因为是用来补全参数的。如果输入service之后立即按TAB键,bash会认为是要补全命令。

[root@web ~]# service TAB 

Display all 100 possibilities? (y or n)

acpid               cvs                 hplip               mdmonitor           psacct              sshd

anacron             daytime-dgram       ip6tables           mdmpd               rawdevices          syslog

apmd                daytime-stream      ipmi                messagebus          rdisc               tcpmux-server

atd                 discard-dgram       iptables            microcode_ctl       readahead_early     tftp

auditd              discard-stream      irda                multipathd          readahead_later     time-dgram

autofs              dnsmasq             irqbalance          netconsole          restorecond         time-stream

avahi-daemon        dund                isdn                netfs               rhnsd               tomcat

avahi-dnsconfd      echo-dgram          jexec               netplugd            rmcp                vncserver

bluetooth           echo-stream         kdump               network             rpcgssd             wdaemon

capi                eklogin             killall             NetworkManager      rpcidmapd           winbind

chargen-dgram       ekrb5-telnet        klogin              nfs                 rpcsvcgssd          wpa_supplicant

chargen-stream      firstboot           krb524              nfslock             rsync               xfs

conman              gpm                 krb5-telnet         nscd                saslauthd           xinetd

cpuspeed            gssftp              kshell              ntpd                sendmail            ypbind

crond               haldaemon           kudzu               pand                setroubleshoot      yum-updatesd

cups                halt                lvm2-monitor        pcscd               single              

cups-config-daemon  hidd                mcstrans            portmap             smartd              

[root@web ~]# service

 

示例四 在cvs命令后按tab键,会显示cvs自带的指令

[root@web ~]# cvs TAB 

add        ci         diff       freeze     import     patch      rdiff      rm         tag        --version  

admin      co         -e         get        -l         -q         release    rtag       unedit     -w         

annotate   commit     edit       -H         log        -Q         remove     stat       up         -x         

-b         -d         export     --help     -n         -r         rfreeze    status     update     -z         

checkout   delete     -f         history    new        rcs        rlog       -t         -v         

[root@web ~]# cvs

问题思考

1. 查看/etc/bash-completion文件,还会发现哪些命令的参数可以自动补全?

2. 怎样自行扩展一些命令参数的补全方式?

相关文章
|
1月前
|
监控 安全 Shell
凭借 Bash 语言实现员工行为管理软件的部分功能
在企业中,员工行为管理软件对于提高工作效率和保障企业安全至关重要。本文介绍了如何使用 Bash 脚本实现员工登录时间监控、特定网址访问记录以及生成报告的基本功能。通过示例代码,展示了如何记录登录时间和访问网址,并将信息汇总生成报告。虽然这是一个简单的示例,但为实际应用提供了基础框架。
24 0
|
6月前
|
Shell Linux
【Linux】Bash支持各种指令选项的原理:命令行参数
【Linux】Bash支持各种指令选项的原理:命令行参数
|
缓存 Shell 开发工具
【Shell编程】Shell中Bash基本功能
【Shell编程】Shell中Bash基本功能
99 0
【Shell编程】Shell中Bash基本功能
|
机器学习/深度学习 Shell
【Shell编程】Shell中Bash变量-位置参数变量
【Shell编程】Shell中Bash变量-位置参数变量
89 0
|
网络协议 Shell
使用本地Bash功能的TCP/UDP请求
使用本地Bash功能的TCP/UDP请求
139 0
|
存储 缓存 Shell
Bash 的基本功能:别名、快捷键、历史命令、输出重定向、管道符、Shell中特殊符号
一、命令别名 1. 命令生效的顺序 执行使用绝对路径或相对路径执行的命令 执行别名 执行Bash内部命令 执行按照 $PATH 环境变量定义的目录顺序查找到的第一个命令 2. 查看别名 命令格式
|
SQL Shell Perl
[20180413]bash 位置参数.txt
[20180413]bash 位置参数.txt --//上午在测试hugepage时,链接http://blog.itpub.net/267265/viewspace-2152888/ --//脚本写的太不灵活,不应该每次测试修改脚本,应该采用传位置参数.
949 0
|
监控 安全 Shell