文档章节

第4章 处理用户输入与显示数据------------(标准文件描述符、STDIN/STDERR/STDOUT、临时重定向、永久重定向exec)

henni_719
 henni_719
发布于 2017/04/22 17:24
字数 2126
阅读 18
收藏 0

4.4 显示数据

4.4.1 标准文件描述符

         Linux系统将每个对象当作文件处理。这包括输入和输出过程。Linux使用文件描述符(file descriptor)标识每个文件对象。文件描述符是一个非负整数,可以唯一地标识会话中打开的文件。每个进行最多可以有9个打开文件的描述符。bash shell为特殊需要保留前3个文件描述符(0,1,2),如下所示:

            

         这3个特殊文件描述符处理脚本的输入和输出。shell使用它们将shell中的默认输入和输出定向到相应位置(默认位置通常是监视器)。

        1.STDIN

         STDIN文件描述符引用shell的标准输入。对于终端接口,标准输入是键盘。shell通过STDIN文件描述符从键盘接受输入,并在键入时处理每个字符。

         使用输入重定向符号(<)时,Linux将使用重定向引用的文件替换标准的输入文件描述符。它读取文件并获取数据,就像是通过键盘键入的一样。

         许多bash命令通过STDIN接收输入,尤其在命令行没有指定文件时。操作实例如下:

            

         也可以使用STDIN重定向符号强制cat命令从STDIN以外的其他文件接收输入。现在cat命令使用包含在文件中的行行为输入。可以使用该技术将数据输入到任何从STDIN接收数据的shell命令。

             

         2.STDOUT

         STDOUT文件描述符引用shell的标准输出。在终端接口,标准输出是终端监视器。shell的所有输出都定向到标准输出,也就是监视器。

         许多bash命令默认将输出定向到STDOUT文件描述符。使用输出重定向符号,所有通常定向到监视器的输出现在都重定向到shell指定的重定向文件。还可以使用>>符号向文件添加数据。

         当命令生成错误消息时,shell不会将错误消息重定向到输出重定向文件。shell创建了输出重定向文件,但是错误消息显示在监视器屏幕上。shell将错误消息与正常输出分开处理。如果创建一个以后台模式运行的shell脚本,则通常必须依赖将发送到日志文件的输出消息。

          

         3.STDERR

         shell使用特殊的STDERR文件描述符处理错误消息。STDERR文件描述符引用shell的标准错误输出。默认情况下,STDERR文件描述符与STDOUT文件描述符指向相同的位置(即使它们分配了不同的文件描述符值)。默认情况下,所有的错误消息都显示在监视器上。

4.4.2 重定向错误

         重定向STDERR数据的方式也没什么不同,只需要在使用重定向符号时定义STDERR文件描述符即可。

         1.仅重定向错误

         STDERR文件描述符的值设置为2.通过替换位于重定向符号前方的这个文件描述符,可以仅重定向错误消息。该值必须位于重定向符号的正前方,否则无效。命令生成的任何错误消息将包含在输出文件中。使用这种方法,shell仅重定向错误消息,不包括普通数据。由于命令将文件描述符2输出(STDERR)重定向到输出文件,因此shell将所有生成的错误消息发送到指定的重定向文件。

         仅重定向操作实例:

                    

         2.重定向错误和数据

         如果需要同时重定向错误和普通数据,则必须使用重定向符号。必须在希望重定向的数据前面放置相应的文件描述符,然后将它们指向相应的输出文件以保存数据。

         通过1>符号,shell将定向到STDOUT的普通输出重定向到相应的文件。通过2>符号,将应该定向到STDERR的错误消息重定向到相应的文件。

         可以使用这项技术将脚本中发生的任何错误消息与普通脚本输出分离开来。同时,如果需要,也可以将STDERR和STDOUT输出重定向到同一个输出文件。为此,bash shell提供了一个特殊的重定向符号,即&>符号。使用&>符号,命令生成的所有输出都发送到同一位置,包括数据和错误。bash shell自动使错误消息的优先级高于标准输出。

4.4.3 临时重定向

         在脚本中使用STDOUT和STDERR文件描述符在多个位置生成输出,只要重定向相应的文件描述符即可。使用脚本重定向输出的方法有两种:临时重定向每一行、在脚本中永久重定向所有命令

         如果想要故意在脚本中生成错误消息,可以将单个输出行重定向到STDERR。需要做的只是使用输出重定向符号将输出重定向到STDERR文件描述符。重定向到某个文件描述符时,必须在文件描述符编号前面添加&号。默认情况下,Linux将STDOUT输出定向到STDOUT。但是,如果运行脚本时重定向STDERR任何使用脚本定向到STDERR的文本将被重定向

         该方法对于在脚本中生成错误消息非常好。如果有人使用脚本,可以使用STDERR文件描述符轻松地重定向错误消息。

         临时重定向操作实例:            

#!/bin/bash
#重定向到某个文件描述符时
#必须在文件描述符编号前面加&

echo "This is error!" >&2
echo "This is normal text!"

         使用STDOUT显示的文本出现在监控器上,而发送到STDERR的echo语句文本重定向到输出文件。

4.4.4永久重定向

         如果在脚本中重定向许多数据,那么重定向每个echo语句就不太方便了。这种情况下,可以使用exec命令通知shell在脚本执行期间重定向特定的文件描述符。exec命令启动一个新的shell,并将STDOUT文件描述符重定向到一个文件。所有定向到STDOUT的脚本输出都将重定向到相应文件。               

#!/bin/bash
#永久重定向:
#使用exec命令通知shell在脚本执行期间重定向特定的文件描述符

exec 2>testerror
echo "This is a standar error!"
echo "this is the start of the script"


exec 1>testout

echo "This is a test of redirecting all output"
echo "from a script to another file."
echo "without having to redirect every individual line" >&2

         脚本使用exec命令将任何定向到STDERR的输出重定向到文件testerror。接下来,脚本使用echo命令将STDOUT显示几行,之后再次使用exec命令将STDOUT重定向到testout文件。注意:即使重定向了STDOUT,也可以指定echo语句的输出定向到STDERR。如果只想将部分脚本的输出重定向到另一个位置,该特性将十分方便。但是重定向STDOUT或STDERR之后,就无法轻松地将它们重定向到原来的位置。

4.4.5 在脚本中重定向输入

         重定向STDOUT和STDERR的技术同样可以用来重定向键盘的STDIN。exec命令可以帮助将STDIN重定向到Linux系统的文件。exec 0< testfile,该命令告知shell它应该从该文件testfile而不是STDIN获取输入。在脚本请求输出的任何时间都可使用这种重定向方式。

         read命令读取用户通过键盘输入的数据。通过将STDIN重定向到文件,在read命令尝试从STDIN读取命令时,它将从文件而不是键盘获取数据。这是一个非常好的技术,可以读取文件的数据并使用脚本处理。Linux系统管理员常见的一个任务是,从日志文件读取数据并进行处理。

         在脚本中重定向输入实例:     

#!/bin/bash
#在脚本中重定向输入
exec 0< continue.txt
count=1

while read line
do
   echo "File #$count:$line"
   count=$[ $count+1 ]
done

本文转载自:http://blog.csdn.net/henni_719/article/details/53580429

henni_719
粉丝 2
博文 466
码字总数 343938
作品 0
信阳
QA/测试工程师
私信 提问
Linux标准输入输出及文件描述符

1.标准文件描述符0,1,2 1.1 STDIN标准输入 对终端界面来说,标准输入时键盘;也可以使用重定向符号<,用重定向指定的文件来代替标准输入文件描述符。 1.2 STDOUT标准输出 在终端界面上,标准...

Caishu
2016/05/16
935
0
IO重定向与文件描述符

1.介绍 IO重定向用于捕捉一个文件,命令,程序,脚本或者代码块的输出,然后把捕捉到的输出作为输入发送给另外一个文件,命令,程序或脚本。 终端程序一般从单一源以流的形式聚集输入和显示输...

adelphos
2015/01/02
0
0
Linux 输入和输出

Linux 必须要知道一个东西:Linux系统将每个对象当作文件处理,输入输出对象也是如此。 Linux 标准文件描述符: 文件描述符 缩写 描述 0 STDIN 标准输入 1 STDOUT 标准输出 2 STDERR 标准错误...

年少爱追梦
2016/05/03
31
0
I/O重定向 详解及例子!

不好意思,今天发现高阶例子的解释中有个错误,同时也修改了一下全文。(2004-4-18) 首先,感谢网中人、r2007、lightspeed等诸位前辈的无私指导!以下的一些结论可能有错,还请各位前辈多...

范堡
2009/05/06
407
0
shell的输入与输出

不好意思,今天发现高阶例子的解释中有个错误,同时也修改了一下全文。(2004-4-18) 首先,感谢网中人、r2007、lightspeed等诸位前辈的无私指导!以下的一些结论可能有错,还请各位前辈多...

zt371
2009/05/06
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

医疗项目pc端后台页面用vue重构整个html页面

页面源码是vue

xintaiideas
34分钟前
2
0
领域驱动中的“贫血症和失忆症” --实践领域驱动--原文

贫血症严重危害着人类健康,并且伴随有危险的副作用。当贫血领域对象被首次提出来时,它并不是一个博得赞美的词汇,它描述的是一个缺少内在行为领域对象。奇怪的是,人们对于贫血领域对象的态...

还仙
37分钟前
5
0
条码打印软件中标签预览正常打印无反应怎么解决

在使用条码打印软件制作标签时,有客户反馈,标签打印预览正常的,但是打印无反应,咨询是怎么回事?今天针对这个情况,可以参考以下方法进行解决。 一、预览正常情况下,打印没反应 (1)在条码...

中琅软件
47分钟前
5
0
判断字符串的时候

判断字符串的时候一定把常量房前边, //报警程度 String leve = vo.getDeviceAlertDeal().getWarnLevel(); if(("0").equals(leve)) { row.add("无报警"); }else if(("1").equals(leve)) { ro......

简小姐
47分钟前
7
0
Linux maven3.6.2 install

PS:安装 maven 之前请先安装 jdk 1.安装 wget 命令(安装过就不用了) yum -y install wget 2.寻找需要的 maven 版本 https://maven.apache.org/download.cgi 3.进入 /var/local 文件夹 cd...

东方神祇
49分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部