MyBLinux联盟由于大多数命令都以参数的形式在命令行上指定输入文件的文件名,所以输入重定向并不经常使用。尽管如此,当要使用一个不接受文件名作为输入参数的命令,而需要的输入内容又存在一个文件里时,就能用输入重定向解决问题。MyBLinux联盟 1. 输出重定向MyBLinux联盟 输出重定向是指把命令(或可执行程序)的标准输出或标准错误输出重新定向到指定文件中。这样,该命令的输出就不显示在屏幕上,而是写入到指定文件中。MyBLinux联盟 输出重定向比输入重定向更常用,很多情况下都可以使用这种功能。例如,如果某个命令的输出很多,在屏幕上不能完全显示,那么将输出重定向到一个文件中,然后再用文本编辑器打开这个文件,就可以查看输出信息;如果想保存一个命令的输出,也可以使用这种方法。还有,输出重定向可以用于把一个命令的输出当作另一个命令的输入(还有一种更简单的方法,就是使用管道,将在下面介绍)。MyBLinux联盟 输出重定向的一般形式为:命令>文件名。例如:MyBLinux联盟 $ ls > directory.outMyBLinux联盟 $ cat directory.outMyBLinux联盟 ch1.doc ch2.doc ch3.doc chimp config mail/ test/MyBLinux联盟 $MyBLinux联盟 将ls命令的输出保存为一个名为directory.out的文件。MyBLinux联盟 注:如果>符号后边的文件已存在,那么这个文件将被重写。MyBLinux联盟 为避免输出重定向中指定文件只能存放当前命令的输出重定向的内容,shell提供了输出重定向的一种追加手段。输出追加重定向与输出重定向的功能非常相似,区别仅在于输出追加重定向的功能是把命令(或可执行程序)的输出结果追加到指定文件的最后,而该文件原有内容不被破坏。MyBLinux联盟 如果要将一条命令的输出结果追加到指定文件的后面,可以使用追加重定向操作符>>。形式为:命令>>文件名。例如:MyBLinux联盟 $ ls *.doc>>directory.outMyBLinux联盟 $ cat directory.outMyBLinux联盟 ch1.doc ch2.doc ch3.doc chimp config mail/ test/MyBLinux联盟 ch1.doc ch2.doc ch3.docMyBLinux联盟 $MyBLinux联盟 和程序的标准输出重定向一样,程序的错误输出也可以重新定向。使用符号2>(或追加符号2>>)表示对错误输出设备重定向。例如下面的命令:MyBLinux联盟 $ ls /usr/tmp 2> err.fileMyBLinux联盟 可在屏幕上看到程序的正常输出结果,但又将程序的任何错误信息送到文件err.file中,以备将来检查用。MyBLinux联盟 还可以使用另一个输出重定向操作符(&>)将标准输出和错误输出同时送到同一文件中。例如:MyBLinux联盟 $ ls /usr/tmp &> output.fileMyBLinux联盟 利用重定向将命令组合在一起,可实现系统单个命令不能提供的新功能。例如使用下面的命令序列:MyBLinux联盟 $ ls /usr/bin > /tmp/dirMyBLinux联盟 $ wc –w < /tmp/dirMyBLinux联盟 459MyBLinux联盟 统计了/usr/bin目录下的文件个数。MyBLinux联盟 管 道MyBLinux联盟 将一个程序或命令的输出作为另一个程序或命令的输入,有两种方法,一种是通过一个临时文件将两个命令或程序结合在一起,例如上个例子中的/tmp/dir文件将ls和wc命令联在一起;另一种是Linux所提供的管道功能。这种方法比前一种方法更好。MyBLinux联盟 管道可以把一系列命令连接起来,这意味着第一个命令的输出会作为第二个命令的输入通过管道传给第二个命令,第二个命令的输出又会作为第三个命令的输入,以此类推。显示在屏幕上的是管道行中最后一个命令的输出(如果命令行中未使用输出重定向)。MyBLinux联盟 通过使用管道符“|”来建立一个管道行。用管道重写上面的例子:MyBLinux联盟 $ ls /usr/bin|wc -wMyBLinux联盟 1789MyBLinux联盟 再如:MyBLinux联盟 $ cat sample.txt|grep "High"|wc -lMyBLinux联盟 管道将cat命令(列出一个文件的内容)的输出送给grep命令。grep命令在输入里查找单词High,grep命令的输出则是所有包含单词High的行,这个输出又被送给wc命令,wc命令统计出输入中的行数。假设sample.txt文件的内容如下:MyBLinux联盟 Things to do today:MyBLinux联盟 Low:Go grocery shoppingMyBLinux联盟 High:Return movieMyBLinux联盟 High:Clear level 3 in Alien vs. PredatorMyBLinux联盟 Medium:Pick up clothes from dry cleanerMyBLinux联盟 那么该管道行的结果是2。MyBLinux联盟 命令替换MyBLinux联盟 命令替换和重定向有些相似,但区别在于命令替换是将一个命令的输出作为另外一个命令的参数。常用命令格式为:MyBLinux联盟 command1 `command2`MyBLinux联盟 其中,command2的输出将作为command1的参数。需要注意的是这里的`符号,被它括起来的内容将作为命令执行,执行后的结果作为command1的参数。例如:MyBLinux联盟 $ cd `pwd`MyBLinux联盟 该命令将pwd命令列出的目录作为cd命令的参数,结果仍然是停留在当前目录下。MyBLinux联盟 第二十二课 在Bash中的操作 2000年/5月/29日MyBLinux联盟 命令和文件名扩展特性MyBLinux联盟 Bash命令行具有命令和文件名扩展特性。当输入一个还没完成的命令或文件名时,只需键入Tab键就能激活命令和文件名扩展特性,从而完成该命令的剩余输入。如果有多个命令或文件的前缀相同,Bash将响铃并等待用户输入足够的字符,以便选择唯一的命令或文件名,如果找到,系统将自动补齐搜索到的命令或文件名,用户按回车键后,系统将执行这条指令。例如:MyBLinux联盟 $ cat pre <Tab>MyBLinux联盟 $ cat prefaceMyBLinux联盟 Bash也能列出当前目录下部分匹配的文件名来完成文件名扩展。如果键入Esc,然后键入?,shell将列出所有与输入的字符串相匹配的文件名。例如下例,在没有完成的输入后键入Esc ?,shell将列出所有与输入的字符串相匹配的字符串,然后shell回显命令行,根据列出的文件名,可以键入要输入的文件名或按下Tab键来完成文件名扩展。例如:MyBLinux联盟 $ lsMyBLinux联盟 document docudramaMyBLinux联盟 $ cat doc <ESC ?>MyBLinux联盟 documentMyBLinux联盟 docudramaMyBLinux联盟 $ cat docudramaMyBLinux联盟 [例】下面是一个目录包含的文件列表:MyBLinux联盟 Firebird2.7.tgz Firebird.README Firebird2.60.tgzMyBLinux联盟 FireBird Firebird2.60.tgz.READMEMyBLinux联盟 现在要删除Firebird2.60.tgz.README文件,键入:MyBLinux联盟 $ rm –f Fi<Tab>MyBLinux联盟 系统会发出警报声,并且自动将命令行补全为:MyBLinux联盟 $ rm –f FireMyBLinux联盟 并等待用户进一步输入文件名的后面部分。现在再键入:MyBLinux联盟 b<Tab>MyBLinux联盟 系统再次发出警报声,并且自动将命令行补全为:MyBLinux联盟 $ rm –f FirebirdMyBLinux联盟 并等待用户进一步输入文件名的后面部分。现在再键入:MyBLinux联盟 2.6<Tab>MyBLinux联盟 系统再次发出警报声,并且自动将命令行补全为:MyBLinux联盟 $ rm –f Firebird2.60.tgzMyBLinux联盟 并等待用户进一步输入文件名的后面部分。现在再键入:MyBLinux联盟 .<Tab>MyBLinux联盟 此时命令将被补全为:MyBLinux联盟 $ rm –f Firebird2.60.tgz..READMEMyBLinux联盟 从上例可以看到,bash总是尽力根据用户输入的信息来补全命令。当无法根据现有信息补全命令时,则提示用户再给出更多的信息,然后再根据用户的提示来进一步补全命令。作为用户最好是能够一次性给出足够的信息以便于bash进行命令补全;否则多按几次<Tab>,时间也就消耗掉了。MyBLinux联盟 命令行编辑MyBLinux联盟 在Bash中可以对命令行进行编辑,以便用户在执行所键入的命令之前能够修改所键入的命令。如果在键入命令时出现拼写错误,只需在运行所键入的命令之前,使用编辑命令来纠正编辑错误,然后执行它,而不用重新输入整行命令。这个功能对以长路径文件名作参数的命令特别有用。MyBLinux联盟 表10-2是对命令行编辑操作的一个总结。MyBLinux联盟 表10-2 命令行编辑操作MyBLinux联盟 MyBLinux联盟 命令行编辑操作MyBLinux联盟 功能MyBLinux联盟 Ctrl+b或左箭头键MyBLinux联盟 左移一个字符(移至前一个字符)MyBLinux联盟 Ctrl+f或右箭头键MyBLinux联盟 右移一个字符(移至后一个字符)MyBLinux联盟 Ctrl+aMyBLinux联盟 移至行首MyBLinux联盟 Ctrl+eMyBLinux联盟 移至行尾MyBLinux联盟 Esc bMyBLinux联盟 左移一个单词MyBLinux联盟 Esc fMyBLinux联盟 右移一个单词MyBLinux联盟 DelMyBLinux联盟 删除光标所在处的字符MyBLinux联盟 Ctrl+dMyBLinux联盟 删除光标所在处的字符MyBLinux联盟 BACKSPACE或Ctrl+hMyBLinux联盟 删除光标左边的字符MyBLinux联盟 Ctrl+kMyBLinux联盟 删除至行尾MyBLinux联盟
|