linux系统中的管道和重定向是shell交互中非常重要的两个功能,二者都能改变命令默认的输入输出行为,但实现逻辑和适用场景有本质区别,理解清楚这两个概念能大幅提升日常命令操作的效率。

管道的定义与核心作用
管道是linux shell中用于连接两个或多个命令的特殊符号,用竖线|表示,它的核心作用是将前一个命令的标准输出,直接作为后一个命令的标准输入,实现命令之间的数据传递,不需要中间临时文件。
管道的使用场景非常广泛,比如我们需要查看当前目录下文件数量,就可以先列出所有文件,再通过管道把输出传递给统计命令:
# 列出当前目录所有文件,统计行数得到文件数量 ls -l | wc -l
再比如我们需要查找某个进程中包含特定关键字的配置,就可以先查看进程信息,再通过管道过滤内容:
# 查看所有进程,过滤包含nginx关键字的进程 ps -ef | grep nginx
重定向的定义与核心作用
重定向是改变命令默认输入输出方向的机制,默认情况下,命令的输入来自标准输入(通常是键盘),输出到标准输出(通常是终端屏幕),错误输出也到终端屏幕。重定向可以把这些输入输出的目标改为文件或者其他设备。
重定向主要分为输入重定向、输出重定向、错误重定向三类,常见的符号如下:
>:标准输出重定向,覆盖写入文件>>:标准输出重定向,追加写入文件<:标准输入重定向,从文件读取内容2>:错误输出重定向,覆盖写入文件&>:标准输出和错误输出都重定向
输出重定向示例
如果我们想把ls命令的执行结果保存到文件,而不是输出到终端,就可以使用输出重定向:
# 把当前目录文件列表覆盖写入file_list.txt ls -l > file_list.txt # 把新的内容追加到file_list.txt末尾 echo "新增测试文件" >> file_list.txt
输入重定向示例
有些命令需要从文件读取内容作为输入,比如统计文件行数,除了直接传文件名,也可以用输入重定向:
# 从file_list.txt读取内容作为wc命令的输入,统计行数 wc -l < file_list.txt
错误重定向示例
当命令执行出错时,错误信息默认会输出到终端,我们可以通过错误重定向把错误信息保存到文件:
# 执行不存在的命令,错误信息覆盖写入error.log wrong_command 2> error.log # 同时把标准输出和错误信息都写入all.log ls -l /tmp /not_exist_dir &> all.log
管道和重定向的核心区别
很多用户会混淆管道和重定向,二者的核心差异可以通过下表清晰区分:
| 对比维度 | 管道 | 重定向 |
|---|---|---|
| 作用对象 | 连接多个命令,传递命令间的输出输入 | 改变命令和文件之间的输入输出方向 |
| 常用符号 | | | > >> < 2> &>等 |
| 是否涉及文件 | 默认不涉及临时文件,直接内存传递数据 | 通常需要和文件交互,读写文件内容 |
| 典型场景 | 命令组合实现复杂数据处理 | 保存命令输出、从文件读取输入、保存错误信息 |
组合使用场景示例
管道和重定向也可以组合使用,比如我们需要把过滤后的进程信息保存到文件:
# 过滤nginx进程信息,把结果保存到nginx_process.txt ps -ef | grep nginx > nginx_process.txt
再比如我们需要统计某个日志文件中错误信息的行数,同时把错误信息单独保存:
# 过滤日志中的ERROR关键字,结果保存到error_info.txt,同时统计行数 grep "ERROR" app.log > error_info.txt && wc -l error_info.txt