第4章 处理用户输入与显示数据------------(标准文件描述符、STDIN/STDERR/STDOUT、临时重定向、永久重定向exec)
2016-12-12 11:03
579 查看
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
相关文章推荐
- 第4章 处理用户输入与显示数据------------(标准文件描述符、STDIN/STDERR/STDOUT、临时重定向、永久重定向exec)
- 第4章 处理用户输入与显示数据------------(标准文件描述符、STDIN/STDERR/STDOUT、临时重定向、永久重定向exec)
- 第4章 处理用户输入与显示数据------------(禁止命令输出、lsof命令、关闭文件描述符、创建读取/写入文件描述符)
- 第4章 处理用户输入与显示数据------------(禁止命令输出、lsof命令、关闭文件描述符、创建读取/写入文件描述符)
- 第4章 处理用户输入与显示数据------------(创建本地临时文件、在/temp中创建临时文件、创建临时目录、tee命令)
- 第4章 处理用户输入与显示数据------------(创建本地临时文件、在/temp中创建临时文件、创建临时目录、tee命令)
- 第4章 处理用户输入与显示数据------------(创建本地临时文件、在/temp中创建临时文件、创建临时目录、tee命令)
- 第4章 处理用户输入与显示数据------------(禁止命令输出、lsof命令、关闭文件描述符、创建读取/写入文件描述符)
- 第4章 处理用户输入与显示数据------------(更高级的getopts命令、标准化选项)
- 第4章 处理用户输入与显示数据------------(参数计数、获取所有数据)
- 第4章 处理用户输入与显示数据------------(参数计数、获取所有数据)
- 第4章 处理用户输入与显示数据------------(参数计数、获取所有数据)
- 第4章 处理用户输入与显示数据------------(从键盘输入的命令read,对输入计时计数)
- 第4章 处理用户输入与显示数据------------(更高级的getopts命令、标准化选项)
- 第4章 处理用户输入与显示数据------------(移位shift、命令行参数选项)
- 第4章 处理用户输入与显示数据------------(读取参数、读取程序名称、测试参数)
- 第4章 处理用户输入与显示数据------------(移位shift、命令行参数选项)
- 第4章 处理用户输入与显示数据------------(读取参数、读取程序名称、测试参数)
- 第4章 处理用户输入与显示数据------------(getopt命令)
- 第4章 处理用户输入与显示数据------------(更高级的getopts命令、标准化选项)