Linux讲座 第二十二课 在Bash中的操作
-------------------------------------------------------------
命令和文件名扩展特性
Bash命令行具有命令和文件名扩展特性。当输入一个还没完成的命令或文件名时,只需键入Tab键就能激活命令和文件名扩展特性,从而完成该命令的剩余输入。如果有多个命令或文件的前缀相同,Bash将响铃并等待用户输入足够的字符,以便选择唯一的命令或文件名,如果找到,系统将自动补齐搜索到的命令或文件名,用户按回车键后,系统将执行这条指令。例如:
$ cat pre
$ cat preface
Bash也能列出当前目录下部分匹配的文件名来完成文件名扩展。*如果键入Esc*,然后键入?**,shell将列出所有与输入的字符串相匹配的文件名。例如下例,在没有完成的输入后键入Esc ?,shell将列出所有与输入的字符串相匹配的字符串,然后shell回显命令行,根据列出的文件名,可以键入要输入的文件名或按下Tab键来完成文件名扩展。
例如:
$ ls
document docudrama
$ cat doc <ESC ?>
document
docudrama
$ cat docudrama
[例]下面是一个目录包含的文件列表:
Firebird2.7.tgz Firebird.README Firebird2.60.tgz
FireBird Firebird2.60.tgz.README
现在要删除Firebird2.60.tgz.README文件,键入:
$ rm –f Fi
系统会发出警报声,并且自动将命令行补全为:
$ rm –f Fire
并等待用户进一步输入文件名的后面部分。现在再键入:
b
系统再次发出警报声,并且自动将命令行补全为:
$ rm –f Firebird
并等待用户进一步输入文件名的后面部分。现在再键入:
2.6
系统再次发出警报声,并且自动将命令行补全为:
$ rm –f Firebird2.60.tgz
并等待用户进一步输入文件名的后面部分。现在再键入:
.
此时命令将被补全为:
$ rm –f Firebird2.60.tgz..README
从上例可以看到,bash总是尽力根据用户输入的信息来补全命令。当无法根据现有信息补全命令时,则提示用户再给出更多的信息,然后再根据用户的提示来进一步补全命令。作为用户最好是能够一次性给出足够的信息以便于bash进行命令补全;否则多按几次
命令行编辑
在Bash中可以对命令行进行编辑,以便用户在执行所键入的命令之前能够修改所键入的命令。如果在键入命令时出现拼写错误,只需在运行所键入的命令之前,使用编辑命令来纠正编辑错误,然后执行它,而不用重新输入整行命令。这个功能对以长路径文件名作参数的命令特别有用。
表10-2是对命令行编辑操作的一个总结。
命令行编辑操作 **功能 (**重要)
Ctrl+b或左箭头键 左移一个字符(移至前一个字符)
Ctrl+f或右箭头键 右移一个字符(移至后一个字符)
Ctrl+a 移至行首
Ctrl+e 移至行尾
Esc b 左移一个单词
Esc f 右移一个单词
Del 删除光标所在处的字符
Ctrl+d 删除光标所在处的字符
BACKSPACE或Ctrl+h 删除光标左边的字符
Ctrl+k 删除至行尾
Ctrl+u 删除当前行
在Bash中,history命令能够保存最近所执行的命令。这些命令的历史记录号从1开始,只有有限个命令可以被保存起来,最多500个,即history命令的历史记录号缺省值为500。要查看最近执行的命令,只要键入history命令,然后键入回车键,最近执行过的命令即按先后顺序被显示出来(各条命令前的数字为历史记录号)。
**[**例]
$ history
1 cp mydata today
2 vi mydata
3 mv mydata reports
4 cd reports
5 ls
…
所有这些命令都被称为事件(event),一个事件表示一个操作已经发生,即一个命令已被执行。这些事件根据它们被执行的先后顺序用数字标识,这一标识称为历史事件号。最后执行的历史事件的事件号最大。每个事件都可由它的历史事件号或命令的初始字符或字符串等确定。
利用history命令能够查询以前的事件,并可把它们显示到命令行上执行这一事件。最简便的方法就是利用上下箭头键,把先前的事件逐次显示到命令行。这个操作不需要运行history命令就可以执行。按动一下上箭头键,那么上一次执行的一个事件就将出现在命令行上,再按一下,上一次的前一事件又会出现在命令行上;按动一下下箭头键,将会使当前事件的下一事件出现在命令行上。
Bash也可以通过键入Esc、Tab键来完成对历史事件的字符扩展。和标准命令行扩展特性一样,键入历史事件的部分字符串,然后键入Esc,再键入Tab键,与刚才键入的字符串相匹配的历史事件将自动扩展并回显到命令行处。如果不止一个事件与输入的字符串相匹配,就会听到一声响铃,继续键入字符或字符串,shell将会唯一确定用户所要键入的历史事件。
还有一个查询和执行历史事件的命令——**!**命令。在!命令后键入与历史事件相关联的字符,这个关联字符可以是历史事件的历史事件号,也可以是该事件的前几个字符。在下面的例子中,查询到历史事件号为3的事件,然后又用其开头的几个字符去匹配,也查询到该命令。
**[**例]
$ !3 (查询并执行第三条历史事件)
mv mydata reports
$ !mv
mv mydata reports
也可以用一个偏移量(相对于历史事件列表中最后一个事件)来查询历史事件。负的偏移量将从历史事件列表表尾向前偏移。在下面的例子中,历史事件号为2的事件“vi mydata”就是用一个负的偏移量查询到的。必须注意的是,这个偏移量是相对于历史事件列表中的最后一个事件的。在本例中,历史事件列表中最后一个事件是事件5,历史事件列表中第一个事件为1。从历史事件号为5的事件,往前偏移4,即是历史事件号为2的事件。
[例]
$ !-4
vi mydata
如果键入!!,则系统默认为上一事件。下面的例子中,用户在命令行上键入!!命令,系统将执行上一事件:“ls”命令。
[例]
$ !!
ls
mydata today reports
也可以用“模式”来搜索一个历史事件。搜索的“模式”必须用符号“?”括起来。下例是用“模式”“?myd?”来搜索历史事件号为3的历史事件“vi mydata”。
[例]
$ !?myd?
vi mydata
查询历史事件
可以在命令行上编辑历史事件列表中的事件。表10-3列出了查询历史事件列表的各种操作。
表10-3 查询历史事件操作
查询历史事件操作 功能
Ctrl+n或向下光标键 移至历史事件列表中当前事件的下一历史事件
Ctrl+p或向上光标键 移至历史事件列表中当前事件的前一历史事件
Esc < 移至历史事件列表表首
Esc > 移至历史事件列表表尾
!event_num 用历史事件号来定位一个历史事件
!characters 用历史事件的字符前缀来查询一个历史事件
!?pattern 用“模式”来查询历史事件列表中的事件
!-event_num 通过偏移量来定位历史事件
配置history:HISTFILE及HISTSIZE
系统保存的历史事件数被保存在一个特定的系统变量中,这个变量就是HISTSIZE。这个变量的缺省值通常被设置为500。这个值可以被修改。例如:
$ HISTSIZE=10
将HISTSIZE的值重新设置为10。
历史事件被保存在一个文件中,文件名由变量HISTFILE指定。通常这个文件的缺省名是.bash_history。通过给变量HISTFILE赋值,可以指定新的文件名。
[例]
$ echo $HISTFILE
/home/lisa/.bash_history
$ HISTFILE=”/home/lisa/newhist”
$ echo $HISTFILE
/home/lisa/newhist
以上操作先显示变量HISTFILE的值,然后赋予它新的值“/home/lisa/newhist”,以后所有的历史事件将被保存在newhist文件中。