linux从入门到精通读薄(四)Bash
第四章 Bash
4-1 路径名扩展
* 用来表示任何文件名(以点开头的文件名称除外)
$ cp text/* backup 复制text下的全部文件到backup
? 用来代表任何单个字符
$ ls /dev/tty?
[ ] 显式清单
$ ls /dev/tty?[23456]
/dev/ttys2 /dev/ttyp2 /dev/ttyq3 /dev/ttyr5 /dev/ttys4
……
匹配的范围还可用一对字符中间加连字符(-)表示
$ ls /dev/tty?[2-6]
{ } 指定整个字的清单
$ mkdir /usr/tmp/{bin,doc,lib,src}
$ ls /usr/tmp
bin doc lib src
有时用一条命令时,送给命令的参数中包含部分或全部特殊字符。这时,要用到引用技术。它告诉shell不管这些被引用字符的特殊含义,将它们作为普通字符一样对待。
bash shell提供三种引用方法:转义字符(\)、单引号(')和双引号(")。
每个需要抑止特殊含义的特殊字符前面都要放一个转义字符:
$ cd
$ mv text/motd text/m\*\?
$ ls text
m*? passwd
如果将字符串放在一对单或双引号之间,则单引号之间的所有字符的特殊含义都将被抑止
4-2 输入/输出重定向
标准输出重定向
> 将命令结果送到>后的文件中,如果文件不存在,则建立这一文件。
>> 将命令结果追加到>>后的文件中。
错误输出重定向
2>
2>>
将标准输出和错误输出同时送到同一文件中,可以使用另一个输出重新定向操作符(&>):
$ ls /usr/tmp &>output.file
输入重定向
<
如:
$ wc </etc/passwd 统计passwd的字数
另一种输入重新定向称为here文档。它告诉shell当前命令的标准输入来自命令行。here文档的重定向操作符使用(<<)。它将一对分隔符(delimiter)之间的正文重新定向输入给命令:
$ wc <<delim
>this text forms the content
>of the here document, which
>continues until the end of
>text delimiter
>delim
4 17 98
当将正文送入here文档时,不必在每行前面加大于符号,它们由shell作为提示符提供。shell用这个提示符告诉你当前的命令还未结束。它在执行命令之前将等待更多的输入。
在<<操作符后面,任何字符都可以用作正文开始前的分隔符,本例中使用delim作为分隔符。here文档的正文一直继续到遇到另一个分隔符为止。第二个分隔符就出现在新行的开头。这时here文档的正文,不包括开始和结束的分隔符,将重新定向送给命令,作为它的标准输入。
4-3 管道
管道使用竖杠(|)作为重新定向操作符
$ ls /usr/bin | wc -w
459
4-4 后台作业
在命令行后面加上&字符,可以将命令放到后台(background)去执行:
$ ls -1R/ >/tmp/ls.1R &
4-5 作业控制
每次用bash执行一条命令时,它都给命令分配一个作业号(job number)。当多个命令在管道行中结合在一起时,将它们作为一个作业对待,给它们分配一个作业号。
作业控制允许将进程挂起并在以后恢复进程的执行。
显示作业清单:
$ jobs
挂起当前的前台作业:
ctrl-z
恢复进程执行:
$ fg 回到前台执行
$ bg 在后台执行
如果不是恢复默认作业,而是恢复作业表中其他作业的运行,可以在命令中用%号后面跟作业号的办法给以明确规定。
$ fg %1
cat >text.file
结束作业:
$ kill
$ kill %1
4-6 历史表
历史表一般能保存500行命令。当退出登录时,bash自动将当前的历史表保存到一个文件中。默认的文件名是.bash_history,存于起始目录下,为隐藏文件。
查看历史表:
$ history | tail -5
511 cat >text.file
512 cd ..
……
历史表中的每一行称为一个事件,行号称为事件号。
重复执行历史命令:
$ ! (事件号)
其中!称为历史替换操作符。
重复最后一条命令:
$ !!
还可以用类似下面的命令:
$ ! ls*
它将执行匹配的第一条命令。
4-7 命令行编辑
为了简化寻找、修改和重新执行历史表中的命令的任务,bash同样允许你对命令进行简单的编辑。如果键盘支持光标移动键(箭头键)。每按一次上箭头键,shell将在历史表中后移一行,并显示上一命令行。按下箭头键则向前移一行。当找到需要的命令时,只要按Enter键就可以重复执行这条命令。
4-8 命令补全
在送入命令的任何时刻,可以按Tab键,shell将试图补全此时已输入的部分命令
4-9 shell函数
用shell函数来组合和存储一组供以后执行的命令是一种方便的途径。shell函数定义的形式如下:
name() {list;}
其中name是用来执行函数的命令名称。而list则是命令或管道行清单,它们之间用分号分开,用来规定函数执行的任务。
例如,若送入下列函数定义:
$ ll() {ls -l;}
就能用ll作为命令来完成ls -l命令同样的功能:
$ ll
drwxr-xr-x 3 pc book 1024 May 28 23:30 book
有了II的定义,可能会认为可以用ll -a来执行ls -al命令。遗憾的是情况并不是这么简单。这是做得到的,但II的定义必须按以下的方式加以改变:
$ ll() {ls -l $*;}
增加$*字符表示在II命令后面送入的任何参数或命令开关应插到ls -l命令中取代$* 字符。
shell的函数体可以由若干条命令或管道行组成,命令或管道行之间用分号分开。