ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

7.5 shell处理数据输出

2021-10-04 20:02:43  阅读:146  来源: 互联网

标签:输出 shell 重定向 文件 命令 描述符 7.5


1.标准文件描述符

Linux用文件表述符(file descriptor)来标识每个文件对象。

文件描述符是一个非负整数,可以唯一标识会话中打开的文件。

每个进程一次最多可以有9个文件描述符。

处于特殊目的,bash shell保留了前三个文件描述符(0,1,2):

文件描述符

缩写

描述

0

STDIN

标准输入

1

STDOUT

标准输出

2

STDERR

标准错误

这三个特殊文件表述符会处理脚本的输入和输出。

shell用它们将shell默认的输入和输出导向到相应的位置。

1.1 STDIN

代表shell的标准输入。

对终端界面来说,标准输入是键盘。shell从STDIN文件表述符对应的键盘获得输入,在用户输入时处理每个字符。

在使用输入重定向符号(<)时,Linux会用重定向指定的文件来替换标准输入文件描述符。

当在命令行上只输入cat命令时,它会从STDIN接受输入。输入一行,cat命令就会显示出一行。

当然也可以通过STDIN重定向符号强制cat命令接受来自另一个非STDIN文件的输入。

如:cat < testfile

现在cat命令会用testfile文件中的行作为输入。

1.2 STDOUT

STDOUT代表shell的标准输出。

在终端界面上,标准输出就是终端显示器。

注意:shell对于错误消息的处理是跟普通输出分开的。

1.3 STDERR

shell通过特殊的STDERR文件描述符来处理错误消息。

shell或shell中运行的程序和脚本出错时,生成的错误消息都会发送到这个位置。

STDERR和STDOUT指向同样的地方,尽管分配给它们的文件描述符值不同。即,默认情况下错误信息也会输出到显示器中。

注意:STDERR并不会随着STDOUT的重定向而发生改变。

2.重定向错误

2.1只重定向错误

将STDERR文件描述符值(2)放在重定向符号前(该值必须紧紧地放在重定向符号前,否则不工作)。

如:ls -al badfile 2> testfile

2.2重定向错误和数据

如果想重定向错误和正常输出,必须使用两个重定向符号。

需要在符号前面放上待重定向数据所对应的文件表述符,然后指向用于保存数据的输出文件。

如:

ls -al  test test2 test3 badtest 2> test6  1> test7

shell利用 1> 符号将ls命令的正常输出重定向到了test7文件,而所有本该输出到STDERR的错误消息通过 2> 符号被重定向到test6.

也可以将STDERR和STDOUT的输出重定向到同一个输出文件。为此bash shell提供了特殊的重定向符号:&>

如:

ls -al test test2 test3 badtest &> test7

当使用 &> 符时,命令生成的所有输出都会发送到同一位置,包括数据和错误。

3.在脚本中重定向输出

 3.1临时重定向

将单独的某一行输出重定向到STDERR,在重定向到文件表述符是,必须在文件表述符数字之前加上一个&

如:

echo "This is an error message." >&2

3.2永久重定向

可以用exec命令告诉shell在脚本执行期间重定向某个特定文件描述符。

如: exec  1> testout

exec命令会启动一个新shell并将STDOUT文件描述符重定向到文件。脚本中发给STDOUT的所有输出会被重定向到文件。

4.在脚本中重定向输入

exec命令可以将STDIN重定向到Linux系统上的文件中。

如: exec 0<  testfile

这个命令会告诉shell它应该从文件testfile中获得输入,而不是STDIN。这个重定向只要在脚本需要输入时就会起作用。

将STDIN重定向到文件后,当read命令试图从STDIN读入数据时,它会到文件中去读取数据,而不是键盘。

5.关闭文件描述符

shell会在脚本退出时自动关闭输入或输出文件描述符。当需要在脚本结束前关闭文件描述符时,需要用到:&-

如: exec 3>&-

该语句会关闭文件表述符3,不再脚本中使用它。

6.创建临时文件

Linux使用/tmp目录来存放不需要永久保留的文件。大多数Linux发行版配置了系统在启动时自动删除/tmp目录的所有文件。

命令:mktemp

该命令会在/tmp目录中创建一个唯一的临时文件。shell会将这个文件的读写权限分配给文件的属主,并将创建者设成文件的属主。一旦创建了文件,在脚本中创建者就有了完整的读写权限,但其他人没法访问该文件。当然,root用户可以访问一切。

6.1 创建本地临时文件

默认情况下,mktemp命令会在本地目录中创建一个文件。要用mktemp命令在本地目录中创建一个临时文件,只要指定一个文件名模板就行了。

模板可以包含任意文本文件名,在文件名末尾加上6个X就行了。

如:mktemp testing.XXXXXX

mktemp命令会用6个字符码替换这6个X,从而保证文件名在目录中使唯一的。

在脚本中使用mktemp命令时,需要将文件名保存到变量中,以便在脚本中引用。

如: tempfile=$(mktemp test1.XXXXXX)

6.2 在/tmp目录中创建临时文件

用‘-t’选项,会强制mktemp命令在系统的临时目录中创建临时文件。这时mktemp命令会返回用来创建临时文件的全路径,而不是只有文件名。

6.3 创建临时目录

用‘-d’选项,mktemp命令则会创建一个临时目录而不是临时文件。

如:tempdir=$(mktemp -d dir.XXXXXX)

7.记录消息

将输出同时发送到显示器和日志文件。

命令:tee

tee命令就像管道的一个T型接头,它将从STDIN过来的数据同时发往两处,一处是STDOUT,另一处是tee命令行所指定的文件名。

格式:tee filename

注意:tee命令默认情况下,会在每次使用时覆盖输出文件的内容,所以要想追加内容到文件中,

需要使用‘-a’选项。

如:date | tee -a testfile

这一日期即显示在了屏幕上,也被追加到testfile文件中。

标签:输出,shell,重定向,文件,命令,描述符,7.5
来源: https://blog.csdn.net/Qiu_SaMa/article/details/120607219

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有