管道本质是将前命令stdout作为后命令stdin实现链式处理,非同时运行;语法为“命令1 | 命令2 | 命令3”,需注意空格、命令输入输出能力及权限、隐藏文件等限制。
macos 终端中,用管道(|)连接多个命令,本质是把前一个命令的标准输出(stdout)自动当作后一个命令的标准输入(stdin),实现数据流的无缝传递。这不是“同时运行”,而是“链式处理”——前一个命令执行完、输出结果后,后一个命令才开始处理这些结果。
管道的基本写法和常见组合
语法统一为:
命令1 | 命令2 | 命令3
- 每个命令必须能接收输入(如 grep、sort、wc、head 等),或能产生输出(如 ls、cat、ps)
- 管道符前后各留一个空格,更清晰、更少出错
- 不能把需要交互输入的命令(如 vim、read)直接放在管道中间
实用例子:从列出文件到筛选统计
比如想查看当前目录下所有以 .log 结尾的文件,并按大小排序,只看前 5 个:
ls -lS | grep "\.log$" | head -5
- ls -lS:详细列表 + 按文件大小降序排列
- grep "\.log$":筛选行末是 .log 的条目(\. 转义点号,$ 表示行尾)
- head -5:取前 5 行结果
配合重定向,保存或追加结果
管道输出默认显示在终端,但你可以用 > 或 >> 保存结果:
- ps aux | grep "python" | wc -l > python_count.txt:统计含 python 的进程数,并写入文件(覆盖)
- ls -a | sort >> filelist.log:把排序后的所有文件名追加到日志末尾
注意易错点
- 错误顺序会失效:比如 grep "txt" | ls 是错的——ls 不读 stdin,它只按参数列出目录,不会处理管道传来的文本
- 权限问题影响输出:如果某个命令因权限不足失败(如 ls /private/var/log),它的错误信息走 stderr,不会进管道;你看到的可能是空结果,而非报错提示
- 隐藏文件需显式开启:想让 ls 在管道中包含隐藏文件,得加 -a,否则 grep "^\." 找不到











