1.6.2实战演练
(1)使用大于号将文本保存到文件中:
该命令会将输出的文本保存在temp.txt中。如果temp.txt已经存在,大于号会清楚给文件中先前的内容。
(2)使用双大于号将文本追加到文件中:
(3)使用过cat查看文件内容:
接着来看看如何重定向stderr。当命令产生错误信息时,该信息会被输出到stderr流。考虑下面的例子:
这里,+是一个非法参数,因此会返回错误信息。
下面的命令会将stderr文本打印到屏幕上,而不是文件中(因为stdout并没有输出,所以out.txt的内容为空):
在下面的命令中,我们使用2>(数字2以及大于号)将stderr重定向到out.txtL
你可以将stderr和stdout分别重定向到不同的文件中:
下面这种更好的方法能够将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没有可读权限:
其中,cat:a1:Permissoin denied属于stderr信息。我们可以将其重定向到一个文件中,同时将stdout信息发送到终端。
我们在处理一些命令输出的同时还想将其保存下来,以备后用。stdout作为但数据流(single stream),可以被重定向到文件或是通过管道传入其他程序,但是无法两者兼得。
有一种方法截可以将数据重定向到文件,还可以提供一份重定向数据的副本作为管道中后续命令的stdin。tee命令从stdin中读取,然后将输入数据重定向到stdout以及一个或多个文件中。
command | tee FILE1 FILE2 | otherCommand
在下面的代码中,tee命令接受到来自stdin的数据。它将stdou的一份副本写入文件out.txt,同时将另一份副本作为后续命令的stdin。命令cat - n为从stdin中接收到的每一行数据前加上行号并将其写入stdout:
默认情况下,tee命令会将文本覆盖,但它提供了一个-a选项,可用于追加内容。
cat a* | tee -a out.txt | cat - n
带有参数的命令可以写成:command FILE1 FILE2 ……,或者就简单的使用command FILE。
要发送输入内容的两份副本给stdout,使用-作为命令的文件名参数即可:
cmd1 | cmd2 | cmd -
例如:
也可以将/dev/stding作为输出文件名来替代stdin。类似地,使用/dev/stderr代表标准错误,/dev/stdout代表标准输出。这些特殊的设备文件分别对应stdin、stderr和stdout。