markdown复制## 1. 重定向的本质与命令行应用
在Unix-like系统中,重定向(Redirection)是进程间通信的基础机制之一。通过重定向,我们可以改变标准输入(stdin)、标准输出(stdout)和标准错误(stderr)的默认数据流向。理解重定向需要先明确几个关键概念:
- **文件描述符**:内核为每个进程维护的打开文件引用表,其中0号对应stdin,1号对应stdout,2号对应stderr
- **管道机制**:通过`|`符号连接多个命令,前一个命令的输出作为后一个命令的输入
- **重定向符号**:
- `>` 覆盖输出到文件
- `>>` 追加输出到文件
- `<` 从文件读取输入
- `2>` 重定向stderr
实际应用中,组合重定向可以解决许多复杂场景。例如将错误日志单独保存:
```bash
gcc main.c 2> compile_errors.log
关键细节:重定向操作符左侧的数字表示文件描述符,省略时默认为1(stdout)。
2>&1表示将stderr合并到stdout
1.1 系统调用层面的实现
在C程序中,重定向通过dup2()系统调用实现。典型代码结构如下:
c复制int fd = open("output.txt", O_WRONLY|O_CREAT, 0644);
dup2(fd, STDOUT_FILENO); // 将stdout重定向到文件
close(fd);
printf("这行文字会写入文件");
内核处理流程:
- 打开目标文件获取新文件描述符
dup2(oldfd, newfd)复制描述符,若newfd已打开则先关闭- 关闭原始描述符释放资源
2. 高级重定向技巧与实战
2.1 多重重定向处理
同时重定向stdout和stderr的三种方式:
bash复制# 方法1:分别重定向
command > output.log 2> error.log
# 方法2:合并输出
command > combined.log 2>&1
# 方法3:现代bash语法
command &> combined.log
2.2 临时重定向恢复
在脚本中保存和恢复原始描述符
