第1章-小试牛刀(06玩转文件描述符号与重定想)

1.6.2实战演练
(1)使用大于号将文本保存到文件中:


image.png

该命令会将输出的文本保存在temp.txt中。如果temp.txt已经存在,大于号会清楚给文件中先前的内容。

(2)使用双大于号将文本追加到文件中:


image.png

(3)使用过cat查看文件内容:


image.png

接着来看看如何重定向stderr。当命令产生错误信息时,该信息会被输出到stderr流。考虑下面的例子:


image.png

这里,+是一个非法参数,因此会返回错误信息。

下面的命令会将stderr文本打印到屏幕上,而不是文件中(因为stdout并没有输出,所以out.txt的内容为空):


image.png

在下面的命令中,我们使用2>(数字2以及大于号)将stderr重定向到out.txtL


image.png

你可以将stderr和stdout分别重定向到不同的文件中:


image.png

下面这种更好的方法能够将stderr转换成stdout,使得stderr和stdout都被重定向到痛一个文件中:
cmd 2>&1 alloutput.txt
或者这样
cmd &> output.txt

如果你不想看到或保存错误信息,那么可以将stderr的输出冲定向到/dev/null,保证一切都会被清除得干干净净。假设我们有3个文件,分别是a1、a2、a3。但是普通用户对文件a1没有“度-写-执行”权限。如果需要打印文件名以a起始的所有文件的内容,可以使用cat命令。来设置一些测试文件:
先创建a1 a2 a3 文件
echo A1 > a1
echo A2 > a2
echo A3 > a3
chmod 000 a1

使用通配符(a*)显示这些文件内容的话,系统会显示出错误信息,因为文件a1没有可读权限:


image.png

其中,cat:a1:Permissoin denied属于stderr信息。我们可以将其重定向到一个文件中,同时将stdout信息发送到终端。


image.png

我们在处理一些命令输出的同时还想将其保存下来,以备后用。stdout作为但数据流(single stream),可以被重定向到文件或是通过管道传入其他程序,但是无法两者兼得。

有一种方法截可以将数据重定向到文件,还可以提供一份重定向数据的副本作为管道中后续命令的stdin。tee命令从stdin中读取,然后将输入数据重定向到stdout以及一个或多个文件中。
command | tee FILE1 FILE2 | otherCommand

在下面的代码中,tee命令接受到来自stdin的数据。它将stdou的一份副本写入文件out.txt,同时将另一份副本作为后续命令的stdin。命令cat - n为从stdin中接收到的每一行数据前加上行号并将其写入stdout:

image.png

默认情况下,tee命令会将文本覆盖,但它提供了一个-a选项,可用于追加内容。
cat a* | tee -a out.txt | cat - n

带有参数的命令可以写成:command FILE1 FILE2 ……,或者就简单的使用command FILE。

要发送输入内容的两份副本给stdout,使用-作为命令的文件名参数即可:
cmd1 | cmd2 | cmd -

例如:


image.png

也可以将/dev/stding作为输出文件名来替代stdin。类似地,使用/dev/stderr代表标准错误,/dev/stdout代表标准输出。这些特殊的设备文件分别对应stdin、stderr和stdout。

你可能感兴趣的:(第1章-小试牛刀(06玩转文件描述符号与重定想))