15呈现数据

一.理解输入和输出
       至此你已经知道了两种显示脚本输出的方法:
        在显示器屏幕上显示输出
        将输出重定向到文件中
       这两种方法要么将数据输出全部显示,要么什么都不显示.但是有时将一部分数据在显示器上显示,另一部分数据保存到文件中也是不错的.对此,了解Linux如何处理输入和输出能够帮助你就能将进本输出放到正确位置。

1.标准文件描述符
       Linux系统将每个对象当做作文件处理。这包括输入和输出进程。Linux用文件描述符(file descriptor)来标识每个文件对象。文件描述符十个非负整数,可以唯一标识会话中打开的文件。每个进程一次最多可以有九个文件描述符。处于特殊目的的,bash shell保留了前三个文件描述符(0,1和2)。
在这里插入图片描述
       这三个特殊文件描述符会处理脚本的输入和输出。shell用他们将shell默认的输入和输出导向到相应的位置。

1)stdin
       STDIN文件描述符代表shell的标准输入。对终端界面来说,标注输入时键盘。shell从STDIN文件面舒服对应的键盘获得输入,在用户输入时处理每个字符。
       在使用输入重定向符号(<)时,Linux会用重定向指定的文件来替换标准输入文件描述符。
       许多bash命令能接受STDIN的输入,尤其是没有在命令行上指定文件的话。下面是个用cat命令处理STDIN输入的数据的例子。

$ cat 
this is a test 
this is a test 
this is a second test. 
this is a second test.

       当在命令行上只输入cat命令时,他会从STDIN输入。输入一行,cat命令就会显示出一行。
       但你也可以通过STDIN重定向符号强制cat命令接受来自另一个非STDIN文件的输入。

$ cat < testfile 
This is the first line. 
This is the second line. 
This is the third line. 
$

       现在cat命令会用testfile文件中的行作为输入。你可以使用这种技术奖数据输入到任何能从STDIN接受数据的shell命令中。

2)STDOUT
       STDOUT文件描述符代表shell的标准输出。在终端界面上,标准输出就是终端显示器。shell的所有输出(包括shell中运行的程序和脚本)会被定向到标准输出中,也就是显示器。
       默认情况下,大多数bash命令会将输出导向STDOUT文件描述符。你可以用输出重定向来改变、

$ ls -l > test2 
$ cat test2 
total 20 
-rw-rw-r-- 1 rich rich 53 2014-10-16 11:30 test 
-rw-rw-r-- 1 rich rich 0 2014-10-16 11:32 test2
-rw-rw-r-- 1 rich rich 73 2014-10-16 11:23 testfile 
$

通过输出重定向符号,通常会显示到显示器的所有输出会被shell重定向到指定的重定向文件。
       你也可以将数据追加到某个文件。这可以用>>符号来完成。

$ who >> test2 
$ cat test2 
total 20 
-rw-rw-r-- 1 rich rich 53 2014-10-16 11:30 test 
-rw-rw-r-- 1 rich rich 0 2014-10-16 11:32 test2 
-rw-rw-r-- 1 rich rich 73 2014-10-16 11:23 testfile 
rich pts/0 2014-10-17 15:34 (192.168.1.2) 
$

       who命令生成的输出会被追加到test2文件中已有数据的后面。
       但是,如果你对脚本使用了标准输出重定向,会遇到一问题。下面的例子说明了可能会出现什么情况。

$ ls -al badfile > test3 
ls: cannot access badfile: No such file or directory 
$ cat test3 
$

       当命令生成错误消息时,shell并未将错误消息重定向到输出重定向文件。shell创建了输出重定向文件,但错误消息却显示在了显示器屏幕上。注意,在显示test3文件的内容时并没有任何错误。test3文件创建成功了,只是里面是空的。
       shell对于错误消息处理是跟普通输出分开的。如果你创建了在后台模式下运行的shell脚本,通常你必须依赖发送到日志文件的输出消息。用这种方法的话,如果出现了错误信息,这些信息是不会出现在日志文件中的。你需要换种方法来处理。

3)STDERR
       shell通过特殊的STDERR文件描述符来处理错误消息。STDERR文件描述符代表shell的标准错误输出。shell或shell中运行的程序和脚本书措施生成的错我消息都会发送到这个位置。
       默认情况下,STDERR文件描述符会和STDOUT中文件描述符指向同样的地方(尽管分配给它们的文件描述符值不同)。也就是说,默认情况下,错误消息也会输出到显示器输出中。
       但从上面的例子可以看出,STDERR并不会随着STDOUT的重定向二发生改变。使用脚本时,你常常会想改变这种行为,尤其是当你希望将错误消息保存到日志文件中的时候。

2.重定向错误
       你已经经知道如何用重定向符号来重定向STDOUT数据。重定向STDERR数据也没太大差别,只要在使用重定向符号时定义STDERR文件描述符就可以了。

1)只重定向错误
       你在表15-1中已经看到,STDERR文件描述符被设成2。可以选择只重定向错误消息,将该文件描述符值放在重定向符号前。该值必须紧紧地放在重定向符号前,否则不会工作。

$ ls -al badfile 2> test4 
$ cat test4 
ls: cannot access badfile: No such file or directory 
$

       现在运行该命令,错误消息不会出现在屏幕上了,该命令生成的任何错误消息都会保存在输出文件中。用这种方法,shell会只重定向错误消息,而非普通数据。这里是另一个将STDOUT和STDERR消息混杂在同意输出中的例子。

$ ls -al test badtest test2 2> test5 
-rw-rw-r-- 1 rich rich 158 2014-10-16 11:32 test2 
$ cat test5 
ls: cannot access test: No such file or directory 
ls: cannot access badtest: No such file or directory 
$

       ls命令的正常STDOUT输出任然会发送到默认的STDOUT文件描述符,也就是显示器。由于该命令将文件描述符2的输出(STDERR)重定向到了一个输出文件,shell会将生成的所有错误消息直接发送到指定的重定向文件中。

2)重定向错误和数据
       如果想重定向错误和正常输出,必须用两个重定向符号。需要在符号前面放上待重定向数据所对应的文件描述符,然后指向用于保存数据的输出文件。

$ ls -al test test2 test3 badtest 2> test6 1> test7 
$ cat test6 
ls: cannot access test: No such file or directory 
ls: cannot access badtest: No such file or directory 
$ cat test7 
-rw-rw-r-- 1 rich rich 158 2014-10-16 11:32 test2 
-rw-rw-r-- 1 rich rich 0 2014-10-16 11:33 test3 
$

       shell利用1>符号将ls命令的正常输出重定向到了test7文件,而这些输出本该是进入STDOUT的。所有本该输出到STDERR的错误消息通过2>符号被重定向到了test6文件。
       可以用这种方法将脚本的正常输出和脚本生成的错误消息分离开来。这样就可以轻松地识别出错误信息,在不用再成千上万行正常输出数据翻腾了。
       另外,如果愿意,也可以将STDERR和STDOUT的输出重定向到同一个输出文件。为此bash shell提供了特殊的重定向符号&>。

$ ls -al test test2 test3 badtest &> test7 
$ cat test7 
ls: cannot access test: No such file or directory 
ls: cannot access badtest: No such file or directory 
-rw-rw-r-- 1 rich rich 158 2014-10-16 11:32 test2 
-rw-rw-r-- 1 rich rich 0 2014-10-16 11:33 test3 
$

       当使用&>符时,命令生成的所有输出都会发送到同一位置,包括数据和错误。你会注意到其中一条错误消息出现的位置和预想中的不一样。badtest文件(列出的最后一个文件)的这条错误消息出现在输出文件中的第二行。为了避免错误信息散落在输出文件中,相较于标准输出,bash shell自动赋予了错误消息更高的优先级。这样你能够集中浏览错误信息了。

二.在脚本中重定向输出
       可以在脚本中用STDOUT和STDERR文件描述符以在多个位置生成输出,只要简单地重定向相应的文件描述符就行了.有两个方法来在脚本中重定向输出:
        临时重定向行输出
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值