单元八实验
标准输入输出和管道
估计用时:30分钟
目标:熟悉Red Hat Linux 系统上的标准输入输出和管道实现。
实验前准备:一台装有Red Hat Linux 系统的机器。
实验1:标准输入和输出
任务:
1、打开您平常使用的文本编辑器并建立两个文档:
packages1.txt 应该含有下列8行:
apache
galeon
mozilla
postgresql
procinfo
rpmfind
sawfish
squid
packages2.txt 应该含有下列6行:
anaconda
openssh
gnome-core
samba
sendmail
xscreensaver
2、cat 是Linux 最简单的文本过滤器(filter)。他的工作就是将他的输入——作为他的一个参数的文档名,或是从标准输入中输入,并且输出不变地输出他到标准输出。
用packages1.txt 来测试cat:
$ cat packages1.txt
3、假如cat 后没有跟参数,他就期待从标准输入的输入。这意味着假如您键入cat 后按回车,似乎什么事也没发生。实际上,cat 在耐心的观察标准输入,等待输入的到达。假如您打入一些字符并按回车键,cat 将您输入的送到标准输出——即原封不动的将您的输入送出。结束
cat 命令,按
$ cat
Type some sample text, then press return.
4、多数Linux 文本进程命令都以过滤器实现(filter),这意味着他能够从标准输入读出,然后对他做一些事,然后送到标准输出。这些命令和cat 很像,但是他们的输出和输入不同。
本单元介绍过的tr,就是这样一个filter。假如您给tr 两个字串作为参数,那么他从标准输入中读出,然后从第一个字串的字母到第二个字串中的字符进行翻译,然后将翻译后的字串写到标准输出中。
重复前一个例子,改用tr。给出的参数将元音字母从小写改为大写。
$ tr 'aeiou' 'AEIOU'
Type some sample text, then press return.
5、要告诉shell 程式的输出不要送到标准输出,而是要重定向到一个文档,那么使用重定向符 >
重复第一个cat 的例子,重定向标准输出到packages1.catfile。这将创建一个packages1.txt的拷贝。cat 这个输出文档,并且用diff 和ls 检验他是否和原先的文档拥有相同的内容。
$ cat packages1.txt > packages1.catfile
$ cat packages1.catfile
$ diff packages1.txt packages1.catfile
$ ls -l packages1*
6、在一个已存在的文档中追加内容,使用>> 操作符。
在packages1.catfile 后追加packages2.txt 的内容,并且检验结果
$ cat packages2.txt >> packages1.catfile
$ cat packages1.catfile
7、假如没有文档名作为参数给cat,并且标准输出(原书写standard input,我觉得错了)定向为一个文档,那么屏幕上打的任何字符直到按下
$ cat > typedin.txt
This time , when text is typed at the keyboard,
It is not echoed back to the screen,
It is instead redirected to the file typedin.txt
$ ls -l typedin.txt
$ cat typedin.txt
8、重复前面的步骤,替换cat 为tr 命令。
$ tr 'aeiou' 'AEIOU' > trfile.txt
This time , when text is typed at the keyboard,
It is not echoed back to the screen with the translation made,
It is instead redirected to the file trfile.txt
$ ls -l trfile.txt
$ cat trfile.txt
9、使用set -o 显示当前bash 的noclobber 选项。检验当重定向输出到一个文档时您的确能够“修补(clobber)”该文档。
$ set -o
$ ls -l /tmp > trfile.txt
$ ls -l trfile.txt
$ cat trfile.txt
10、使用set 修改noclobber 选项,然后检验操作:
$ set -o noclobber
$ echo "new contents" > trfile.txt
bash: foo: cannot overwrite existing file
11、cat 能够接受一个文档名,或一个重定向的文档作为标准输入。测试下面两个命令:
$ cat packages1.txt
$ cat < packages1.txt
12、然而,tr 不允许文档名作为参数,他需要从标准输入的输入。
$ tr 'aeiou' 'AEIOU' < packages1.txt
13、标准输出和输入能够同时被重定向,就像下面这个例子。和上面相同,从packages1.txt
定向输入到tr,但是这次需要重定向输出。屏幕上没有输出——他输出到了文档
packages1.trfile.txt。
$ tr 'aeiou' 'AEIOU' < packages1.txt >pacakges1.trfile.txt
$ ls -l packages1.txt packges1.trfile.txt
$ cat packages1.trfile.txt
实验2:管道
1、为了将标准输出从一个命令定向到另外一个命令作为标准输入,引入了一种叫做管道的特别的重定向机制。
若没有管道,打印一个目录列表,至少需要两步——而且更有一个文档作为打印后没用的副产品。需要第三步来删除他。(注意,这些步骤当您没有打印机时仅作演示使用)
$ ls -l > /tmp/ls.txt
$ lpr /tmp/ls.txt
$ rm /tmp/ls.txt
假如使用管道,这三步能够在一个短命令中完成——并且无需建立临时文档、再删除。注意lpr 从标准输入中得到输入,所以没有必要加任何参数。
$ ls -l | lpr
2、管道经常用于一个可能生成多行的命令,输出到less。命令执行的顺序是从左开始。当输出生成后,通过管道传到在右边等待的命令。less 从一个管道中等待输入,所以无需加任何参数。(用空格键翻页,然后按q退出)
$ ls -l /usr/bin | less
实验3:练习
假如您需要答案,答案在后面列出。但请用本单元提供的信息和man page努力完成这些练习。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




