1-6玩转文件描述符和重定向

1.6玩转文件描述符和重定向

文件描述符是与输入和输出流相关联的整数。

1.6.1 预备知识

脚本可以使用大于号将输出重定向到文件中。

文件描述符是与某个打开的文件或数据流相关联的整数。文件描述符0、1以及2是系统预留的。

  • 0 —— stdin (标准输入)。

  • 1 —— stdout(标准输出)。

  • 2 —— stderr(标准错误)。

1.6.2 实战演练

1.使用大于号将文本保存到文件中(覆盖)
echo "This is a example text 1" > temp.txt		#如果temp.txt已存在,则清空其中内容
2.使用双大于号将文本追加到文件中
echo "This is a example text 2" >> temp.txt
3.将stderr文本保存到文件中(覆盖)
ls + 2> out.txt			#OK,指定了stderr流
ls + > out.txt #NO,默认stdout流即1>,里面没有消息
4.将stderr和stdout分别重定向到不同文件
cmd 2> stderr.txt 1> stdout.txt
5.将stderr和stdout输出到一个文件
cmd 2>&1 alloutput.txt	#OK
cmd &> output.txt #OK
6.不显示、保存stderr
command 2> /dev/null	#将命令重定向至空设备中
7.保存数据同时作为下一命令输入使用

stdout作为单数据流(single stream),可以被重定向到文件或是通过管道传入其他程序,但是无法两者兼得。

tee命令接收到来自stdin的数据。它将stdout的一份副本写入文件out.txt,同时将另一份副本作为后续命令的stdin。

cat命令没有文件参数,会从stdin读取,再输出到stdout

command | tee FILE1 FILE2 | otherCommand
#eg
cat a* | tee out.txt | cat -n
cat a* | tee -a out.txt | cat -n #使用-a表示追加到文件末尾

注意:|符号表示前一个命令的输出作为下一个命令的标准输入。(即将stdout重定向到stdin)

8.将输入的文字标行号并重定向到两份文件中
tee stdout.txt | cat -n > out.txt 		#从stdin读入,输入到stdout.txt,同时标号输入out.txt

1.6.4 补充内容

1.将文件重定向到命令

像读取stdin一样读取文件,使用<

cmd < file
2.重定向脚本内部的文本块

可以将脚本中的文本重定向到文件。

案例

要想将一条警告信息添加到自动生成的文件顶部,可以使用下面的代码:

#!/bin/bash 
cat << EOF > log.txt #从该命令下一行开始
This is a generated file. Do not edit. Changes will be overwritten.
EOF #到EOF结束,不含EOF

结果:

cat log.txt
This is a generated file. Do not edit. Changes will be overwritten.
3.自定义文件描述符

使用exec命令,后面跟新的文件描述符和文件名

exec 3< input.txt	#将input.txt作为3,输入模式
cat <&3

exec 4> output.txt # 将output.txt作为4,输出模式
echo newline >&4

exec 5>> input.txt #将input.txt作为5,追加模式
echo append new line >&5 #不是>>