Linux脚本攻略学习笔记之文件描述符和重定向

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/whandgdh/article/details/83999944

一、文件描述符定义

文件描述符是与文件输入、输出相关联的整数。它们用来跟踪已打开的文件。最常见的文件描述符是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

猜你喜欢

转载自blog.csdn.net/whandgdh/article/details/83999944