文件描述符是与文件输入、输出相关联的整数。它们用来跟踪已打开的文件。最常见的文件
描述符是 stdin
、 stdout
和 stderr
。我们甚至可以将某个文件描述符的内容重定向到另一个文
件描述符中。
在编写脚本的时候会频繁使用标准输入stdin
、标准输出stdout
和标准错误
stderr
。通过内容过滤将输出重定向到文件是我们平日里的基本任务之一。当命令输出文本
时,这些输出文本有可能是错误信息,也可能是正常的(非错误的)输出信息。单靠查看输出的
文本本身,我们没法区分哪些是正常,哪些是错误。不过可以通过文件描述符来解决这个问题,
将那些与特定描述符关联的文本提取出来。
文件描述符是与某个打开的文件或数据流相关联的整数。文件描述符 0
、 1
以及 2
是系统预留的。
0 —— stdin (标准输入)
1 —— stdout (标准输出)
2 —— stderr (标准错误)
实战
-
通过截断文件的方式,将输出文本存储到文件
temp.txt
中,写入文件之前,temp.txt
中的内容首先会被清空。echo "This is a sample text 1" > temp.txt
-
将文本追加到目标文件中
echo "This is sample text 2" >> temp.txt
-
将
stdout
输入文件中,stderr
打印到屏幕上cmd > out.txt
-
将
stderr
输入文件中,stdout
打印到屏幕上cmd 2> out.txt
-
将
stderr
单独重定向到一个文件,将stdout
重定向到另一个文件cmd 2>stderr.txt 1>stdout.txt
-
将
stderr
转换成stdout
,使得stderr
和stdout
都被重定向到同一个文件中cmd 2>&1 output.txt cmd &> output.txt
-
既可以将数据重定向到文件,还可以提供一份重定向数据的副本作为后续命令的
stdin
。# tee 只能从`stdin`中读取 cat a* | tee out.txt | cat -n
- tee命令
在输出信息的同时把信息记录到文件中ls | tee ls.txt
将会在终端上显示ls命令的执行结果,并把执行结果输出到ls.txt
文件中,将会覆盖原文件的内容,若无ls.txt
文件,将会自动创建该文件ls | tee -a ls.txt
保留ls.txt
文件中原来的内容,并把ls命令的执行结果追加到ls.txt
文件的最后,不覆盖原来的内容ls | tee file1.txt file2.txt
- tee命令
补充
-
将文件重定向到命令
# cmd <file bash <(curl -s https://gitee.com/yw007/codes/6v34iz57ruhtdx1scq9fa100/raw?blob_name=hello_world.sh)
-
将脚本内部的文本块进行重定向
有时候,我们需要对文本块(多行文本)进行重定向,就像对标准输入做的那样。考虑一个
特殊情况:源文本就位于shell脚本中。一个实用的例子是向log文件中写入头部数据,可以按照下
面的方法完成:#!/bin/bash cat<<EOF>log.txt LOG FILE HEADER This is a test log file Function: System statistics EOF