目录
1、了解Linux如何处理输入输出
1.1、标准文件描述符
1.1.1、STDIN
1.1.2、STDOUT
1.1.3、STDERR
1.2、重定向错误
1.2.1、只重定向错误
1.2.2、重定向错误和数据
2、在脚本中重定向输出
2.1、临时重定向
2.2、永久重定向
3、在脚本中重定向输入
4、创建自己的重定向
4.1、创建输出文件描述符
4.2、重定向文件描述符
4.3、创建输入文件描述符
4.4、关闭文件描述符
5、列出打开的文件描述符
6、阻止命令输出
7、创建临时文件
7.1、创建本地临时文件
7.2、在/tmp目录创建临时文件
7.3、创建临时目录
8、记录消息
完整笔记请前往此处获取:https://download.csdn.net/download/qq_55908180/88366003
这里是演示如何把脚本的输出重定向到Linux系统的不同位置
前面已经学习了两种显示输出的方法:1、在屏幕上显示输出;2、把输出重定向到文件中。但这两种方法要么全显示,要么就全不显示。
Linux用文件描述符来标识每个文件对象。文件描述符是一个可以唯一标识会话中打开的文件的的一个非负整数。每个进程一次最多可以有九个文件描述符。bash shell保留了(0、1、2)。
0:STDIN 标准输入;
1:STDOUT 标准输出;
2: SRDERR 标准错误。
这三个特殊的文件描述符会处理输入和输出。
表示标准输入。如果使用输入重定向符号,Linux会读取重定向指定的文件并提取数据,类似于从键盘上输入的一样。
在命令行上使用cat命令时,他会从STDIN接受输入,每输入一行,cat就会显示一行。但是,当使用重定向符号强制cat命令接受非STDIN文件的输入。如:
在默认情况下,大多数的shell命令会把输出导向STDOUT文件描述符,可以用输出重定向来改变。如:
不仅如此,还可以用>>符号把数据追加到某个文件。如:
Shell对于错误消息的处理是和普通输出分开的,因此,即使你创建了输出重定向文件,错误消息也不会保存到该文件中。
shell是通过STDERR文件描述符来处理错误消息的,shell或者shell运行的程序和脚本出错时生成的错误消息都会放到这个位置。但是,默认情况下,错误消息也会输出到显示器上。
使用重定向STDERR数据和使用STDOUT没有什么差别,只要在使用重定向符号时定义STDERR文件描述符就可以了。下面给出两种方法。
STDERR文件描述符被设成2,可以选择只重定向错误消息,把文件描述符的值放在重定向符号前。注意:这个值必须紧紧地放在重定向符号前,否则就不会工作。如:
这种方法会把生成的错误消息保存到输出文件中,但是这种方法只会重定向错误消息,而非普通数据,下面时另一个把STDOUT和STDERR消息混在一起输出,但shell会把生成的错误消息直接发送到指定的重定向文件中,正常的输出仍会发送到显示器。如:
想要重定向错误和正常输出的话,就要使用两个重定向符号,需要在符号前放上待重定向数据所对应的文件描述符,然后指向用户保存数据的输出文件。如:
在这里,shell通过1>符号把ls命令的正常输出重定向到了test5,所有的错误信息通过2>符号被重定向到了test4.
当使用&>符时,命令生成的所有输出就都会发送到同一位置,包括数据和错误。其中,相较于标准输出,bash shell自动赋予了错误消息更高的优先级。
只要简单的重定向相应的文件描述符,就可以在脚本中用STDOUT和STDERR文件描述符在多个位置生成输出。有两种方法来自脚本中重定向输出:
1、临时重定向行输出;
2、永久重定向脚本中的所有命令。
如果想要在脚本中生成错误消息,可以把单独的一行输出重定向到STDERR。在重定向到文件描述符时,必须在文件描述符数字前加上一个&。
在默认情况下,Linux会把STDERR导向STDOUT,但是,若你在运行脚本时重定向了STDERR,脚本就会重定向所有导出STDERR文件。如:
如果在脚本中有大量需要重定向的数据,就可以用exec命令告诉shell在脚本中执行期间重定向某个特定文件描述符。
exec命令会启动一个新的shell并把STDOUT文件描述符重定向到文件,在脚本中发给STDOUT的所有输出被重定向到文件。
当然也可以在脚本执行过程中重定向STDOUT。如:
如果只想把脚本的部分输出重定向到其他位置时,这个特性用起来就会非常方便。但是,这种方法,一旦重定向了STDOUT或STDERR,就很难再把它们重定向到原来的位置。
也可以使用脚本重定向STDOUT和STDERR相同的方法把STDIN从键盘重定向到其他位置。exec命令允许你把STDIN重定向到Linux系统上的文件中: exec 0< testfile
这个命令会告诉shell它应该从文件testfile 中获得输入,而不是STDIN。
可以用exec命令给输出分配文件描述符,只要把另一个文件描述符分配给一个文件,那么,这个重定向就一直有效,直到重新分配。如:
我们可以分配另外一个文件描述符给标准文件描述符,反之亦然。也就是说,可以把STDOUT的原来位置重定向到另一个文件描述符,然后再利用该文件描述符重定向回STDOUT。如:
首先,脚本把文件描述符3重定向到文件描述符1的当前位置,即STDOUT。这意味着所有发送给文件描述符3的输出都出现在显示器上。
第二个exec命令把STDOUT重定向到文件,shell会把发送给STDOUT的输出直接重定向到输出文件中。但文件描述符3依旧指向显示器。
可以用同样的方法重定向输入文件描述符。在重定向到文件之前,先把STDIN文件描述符保存到另外一个文件描述符,然后再读取完文件之后再把STDIN恢复到它原来定的位置。
如果你创建了新的输入输出文件描述符,shell脚本会在退出时自动关闭它们。但有些时候,你需要在脚本结束前手动关闭文件描述符。要关闭文件描述符,把它重定向到特殊符号&-。在脚本中如:exec 3>&- 即关闭文件描述符3,把它重定向到特殊符号&-。如:
只要关闭了文件描述符,就不能在脚本中向它写入数据,否则脚本会生成错误消息。
注意:在关闭脚本时,如果你随后在脚本中打开同一个输出文件,shell会用一个新文件来替换原文件。如:
lsof命令会列出Linux系统打开的的所有的文件描述符。
注意:普通用户要想运行lsof命令,必须通过全路径名来引用。即:/usr/sbin/lsof
该命令会显示当前Linux系统上打开的每个文件的有关信息。当然,有许多命令行选项和参数可以用来过滤输出,最常用的有-p和-d。前者可以指定进程ID(PID),后者允许指定要显示的文件描述符编号。
有时候,在后台运行的脚本会出现错误,为了解决shell会把错误不断发给进程属主,可以把STDERR重定向到一个叫做null文件的特殊文件,shell输出到null文件的所有数据都不会保存。
Linux系统有专供临时文件使用的特殊目录。/tmp。mktemp命令可以在/tmp目录中创建一个唯一的临时文件。
默认情况下,mktemp会在本地目录中创建一个文件。如:
注意:
1、这里的X一定要用大写,小写会出错;
2、mktemp命令会用6个字符码代替这6个X,确保文件名在目录中是唯一的。
-t选项会强制mktemp命令在系统的临时目录创建该文件。注意,在使用这个特性时,mktemp命令会返回用来创建临时文件的全路径,而不是只有文件名。如:
-d选项告诉mktemp命令创建的是一个临时目录。如:
只要使用特殊命令:tee命令就可以把输出同时发送到显示器和日志文件。
tee命令相当于管道的一个T型接头。它将从STDIN过来的数据同时发往两处。一处是STDOUT,另一处是tee命令行所指定的文件名: tee filename
由于tee会重定向来自STDIN的数据,可以用它配合管道符命令来重定向命令输出。如:
输出出现在了sTDouT中,同时也写入了指定的文件中。注意,在默认情况下,tee命令会在每次使用时覆盖输出文件内容。如:
如果想要把数据追加到文件中,必须用-a选项。如: