
🔥个人专栏:Linux—登神长阶
其实之前我们在这篇博客里面,已经提过了 重定向的 一些知识,这里是对 其做出的 一些补充学习,大家可以先看看之前的博客内容,再来学习这个
【Linux】基础 IO(文件描述符fd & 缓冲区 & 重定向)
🚀 在 Linux 中,cerr 是 C++ 标准库中的一个输出流,用于输出错误消息。它是 isotream 头文件的一部分,具体定义在 std 命名空间下。以下是对 cerr 的详细说明:
使用 cerr 输出错误信息的基本语法如下:
#include <iostream>
using namespace std;
int main()
{
cerr << "Hello cerr" << endl;
return 0;
}运行如下:(错误信息 将立即输出到标准错误流。)

还记得我们之前对输出重定向是怎么使用的嘛,如下:
举个例子,我们先编写如下程序 test.cc
#include <iostream>
#include <cstdio>
int main()
{
std::cout << "Hello cout" << std::endl;
printf("Hello printf\n");
}然后输入指令 g++ test.cc,生成可执行文件 a.out

假如我们的代码里面有标准错误,修改如下:
#include <iostream>
#include <cstdio>
int main()
{
// 1. 标准输出
std::cout << "Hello cout" << std::endl;
printf("Hello printf\n");
// 2. 标准错误
std::cerr << "Hello cerr" << std::endl;
fprintf("Hello fprintf\n");
return 0;
}重定向如下:

解释:
虽然 1 和 2 指向同一个文件,但是这里只把log.txt 在OS内部对应的文件地址写到了1号里面,2号下标指向依然指向显示器文件,因此2仍然往显示器上面输出
造成上述结果的原因主要与标准输出和标准错误流的特性以及重定向机制有关。具体来说,以下几点解释了为什么 cout 和 cerr 的输出表现不同:🔍
endl),才会一次性写入终端。
> 时,系统会将标准输出(stdout)重定向到指定的文件log.txt,cerr 仍然会直接输出到终端。flush 时才写入文件,而 cerr 的输出立即显示。因此,终端上的错误信息会在文件内容输出后立刻可见。这种机制确保了:
如下:

对于上面代码,我们把输出和错误都重定向到文件中

上面我们是重定向到两个文件中,假如我们重定向到一个文件中呢,如下:

这里为啥最后只有标准错误的内容呢?
原因:由于重定向打开会先把文件清空,然后再进行打印,因此我们如果要让最后的打印把标准输出和标准错误的内容,都打印出来,需要做如下修改:

简化上面的写法 2&1

2>&1:这是一个重要的部分,用于将标准错误(文件描述符 2)重定向到标准输出(文件描述符 1)。这意味着错误信息会被写入到 log.txt 中,而不是显示在终端bash中,需要将脚本 demo.sh 的标准输出和标准错误输出重定向至文件demo.log,以下哪些用法是正确的 [多选]
正确答案: A B C D
A. bash demo.sh &>demo.log B. bash demo.sh >&demo.log C. bash demo.sh >demo.log 2>&1 D. bash demo.sh 2>demo.log 1>demo.log
分析: 在命令的重定向中, >表示重定向,0 表示标准输入,1 表示标准输出,2 表示标准错误 如果需要将标准输出和标准错误输出重定向至文件demo.log; 比较典型的方式是:bash demo.sh 1>demo.log 2>&1
A、command &> file 表示将标准输出stdout和标准错误输出stderr重定向至指定的文件file中。 B、与A的选项功能雷同 C、一个十分典型的写法,将标准输出和标准错误都重定向到文件, >demo.log是一种把前面的标准输出 1 忽略掉的写法 D、比较直观的一种写法,给我们直观的将标准输入和标准错误分别重定向到文件