一、文件描述符定义
文件描述符是与文件输入、输出相关联的整数。它们用来跟踪已打开的文件。最常见的文件描述符是stdin,stdout,stderr。在编写脚本的时候,会频繁的使用标准输入(stdin)、标准输出(stdout)和标准错误(stderr),通过内容过滤将输出 重定向到文件是我们平日里的基本任务之一。
文件描述符是与某个打开的文件或数据流相关联的整数。
1.1、标准输入 (stdin)
代码为 0 ,使用 < 或 << ; /dev/stdin -> /proc/self/fd/0 0代表:/dev/stdin 。< 这个连续两个小符号, 他代表的是『结束的输入字符』的意思。这样当空行输入eof字符,输入自动结束,不用ctrl+D
1.2、 标准输出 (stdout)
代码为 1 ,使用 > 或 >> ; /dev/stdout -> /proc/self/fd/1 1代表:/dev/stdout
1.3、 标准错误输出(stderr)
代码为 2 ,使用 2> 或 2>> ; /dev/stderr -> /proc/self/fd/2 2代表:/dev/stderr
二、示例演示
2.1 输出文本重定向或保存到一个文件中
echo "this is a sample text 1" > temp.txt #如果文件不存在,在当前目录新建
这种方法通过截断文件的方式。将输出文本存储到文件temp.txt 中 也就说在把echo 命令的输出写入文件之前,在temp.txt中的内容首先会被清空
2.2 将文本追加到目标文件中
echo "this is sample text 2">> temp.txt
2、3 标准错误以及如何对它重定向
ls +这里, + 是一个非法参数,因此将返回错误信息成功和不成功的命令。
当一个命令发生错误并退回时,它会返回一个非0的推出状态。而当命令成功后,它会返回数字0。退出状态可以从特殊变量$?中获得。(在命令执行成功后立刻运行echo $?,就可以打印退出状态)
ls + >out.txt
这个命令只会将stderr文本打印到屏幕上,而不是文件out.txt中 因为没有 stdout的输出.
ls + 2>out.txt #正常运行
查看out.txt 里的报错信息
三、 stderr 和stdout重定向示例
echo a1>a1 # 将a1重定向到a1文件中
cp a1 a2; cp a2 a3 # 复制文件a1 为a2 a3
chmod 000 a1 #清除 a1 所有权限
#cat a* 访问所有a开头的文件,则 访问a1时会报错 a2 a3 能正常访问
3.1、 将stderr 重定向到 sdterr.txt 中 stdout 保持不变
报错信息就不会显示到前端
cat a* 2>stderr.txt
查看报错信息
cat stderr.txt
3.2将 stderr 和stdout 都重定向到一个文件中
看到屏幕上没有任何输出。
再来看重定向的文件,stderr和stdout全部输出到了output.txt中
3.3、stderr.txt和stdout分别重定向到不同的文件中
cat stderr.txt
cat stdout.txt
四、tee重定向命令
tee既可以将数据重定向到文件,还可以提供一份重定向数据的副本作为后续命令的stdin
语法:command | tee file1 file2
4.1实例
cat a* |tee out.txt |cat -n
管道“|”(pipe line):上一个命令的 stdout 接到下一个命令的 stdin;
tee 命令接受到来自stdin的数据。它将stdout 的一份副本写入文件out.txt,同时将另一个副本作为后续命令的stdin。命令cat -n 将从stdin中接收到的每一行数据前加上行号写入stdout
查看副本文本 cat out.txt
4.2 -a 追加模式
看到out.txt中没有显示记录错误信息,因为错误 信息stderr不是stdout | 不会传给tee 命令,tee 命令只会从stdin中获取数据,默认情况下 tee 命令会将文件覆盖,但它提供了一个 -a (append)选项,用于追加内容。
如 cat a* | tee -a out.txt |cat -n
再次查看out.txt文件,可以看到里面有4条记录而不是两条
五、补充
5.1、使用stdin从文件读取数据
语法:cmd < file
5.2将脚本内部的文本块进行重定向
< 这个连续两个小符号, 他代表的是『结束的输入字符』的意思。这样当空行输入eof字符,输入自动结束,不用ctrl+D
cat <<EOF>log.txt
> LOG FILE HEADER
> This is a test log file
> Function:System statistcs
> EOF
查看log.txt
可以看到在cat <log.txt与下一个EOF之间的所有文本行都会被当做stdin 数据,并写入到log.txt