每日科普 · 2026-10-16 周五
考研 408 × 求职面试
知识点 · Linux · 基础
输入输出重定向与管道
Linux 中,每个进程默认打开三个标准流:0 标准输入、1 标准输出、2 标准错误。重定向就是改变这些文件描述符的指向:> 覆盖写文件,>> 追加,< 从文件读,2> 重定向错误,2>&1 把错误并入标准输出。例如 echo hello > a.txt 把 hello 写入文件;wc -l < a.txt 把文件内容作为 wc 的输入。
管道 | 把前一个命令的标准输出接到后一个命令的标准输入,例如 ls | grep txt、ps aux | grep python。Shell 先创建管道和子进程,再用 dup2 把管道读/写端复制到 0/1,最后 exec 命令。因此管道通常只传 stdout,stderr 仍显示在终端;若需连同错误一起传,要写 2>&1 | ...。
核心记忆:重定向是“换插头”,管道是“接水管”。注意 > 前系统先清空文件,2>&1 的位置会影响结果,管道两端并发读写,缓冲区满或读端关闭需正确处理。
每日一题 · Linux
输入输出重定向与管道
执行命令 cmd > out.txt 2>&1 后,下列说法正确的是?
A. 只有 stdout 写入 out.txt,stderr 仍到终端
B. stdout 和 stderr 都写入 out.txt
C. stderr 写入 out.txt,stdout 仍到终端
D. stdout 和 stderr 都追加到 out.txt 末尾
解析
答案:B。Shell 从左到右处理重定向:先把 fd1 指向 out.txt,再让 fd2 复制 fd1,因此 stdout 和 stderr 都进入 out.txt。若写成 cmd 2>&1 > out.txt,fd2 先复制原来的 stdout(终端),随后 fd1 才改到文件,stderr 仍在终端。> 是覆盖而非追加,所以 D 错。关键考点是重定向顺序与文件描述符复制。
面试小贴士 · Linux
输入输出重定向与管道
面试常问 |、>、2>&1、/dev/null 及实现。答:重定向改 fd,管道用 pipe+dup2+exec,只连 stdout。易错:2>&1 顺序、>> 与 >、管道不传 stderr、SIGPIPE。
代码实现 · C
代码示例
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
int main(void) {
int fd[2];
pipe(fd);
pid_t pid = fork();
if (pid == 0) {
// 子进程:stdin 重定向到管道读端,执行 wc -l
dup2(fd[0], STDIN_FILENO);
close(fd[0]);
close(fd[1]);
execlp("wc", "wc", "-l", NULL);
} else {
// 父进程:向管道写端写入两行
close(fd[0]);
const char *msg = "hello\nworld\n";
write(fd[1], msg, strlen(msg));
close(fd[1]);
waitpid(pid, NULL, 0);
}
return 0;
}