Linux 小工具可以像积木连接:一个命令输出文本,另一个接收并处理。理解标准输入(stdin)、标准输出(stdout)和标准错误(stderr),就能把孤立命令变成处理流程。
标准数据流
终端中,stdin 通常来自键盘,stdout 显示普通结果,stderr 显示错误。它们分别常用文件描述符 0、1、2 表示。管道和重定向只是改变这些流原本的来源或去向。
stdin · 0命令读取的数据
stdout · 1正常结果输出
stderr · 2独立的错误输出
使用 | 连接命令
ls /etc | less 把目录列表交给分页器;ps aux | grep nginx 从进程列表筛选 nginx。多个管道可连续使用,例如 grep "ERROR" app.log | sort | uniq。当 grep 本身能读取文件时,通常无需额外写 cat app.log | grep。
> 覆盖,>> 追加
ls /etc > files.txt 把 stdout 写入文件,已有内容会被覆盖;echo "another line" >> notes.txt 保留原内容并追加。管道与重定向可组合:grep "ERROR" app.log | sort > errors.txt。
< 输入与 2> 错误重定向
sort < names.txt 让 Shell 把文件作为 stdin。find / -name "config.txt" 2> errors.txt 只把错误写入文件,正常结果仍显示。2> /dev/null 会丢弃错误,但排查问题时不应习惯性隐藏线索。
阅读方向:从左到右追踪数据;| 交给下一个命令,> 或 >> 把最终 stdout 交给文件。
互动实验
追踪命令中的数据流
访问权限免费
stdout → pipe → stdout
当前正在观察:ps aux。
知识测验
题目
要把新状态追加到 status.log,不覆盖旧内容,应使用?
知识测验
题目
哪个写法把 stderr 写入 errors.txt,同时让 stdout 留在终端?
动手练习
构建日志处理流程
为下面四个数据流任务各写一条命令,明确区分覆盖、追加和 stderr。
- 筛选 app.log 中的 ERROR,排序后覆盖写入 errors.txt。
- 把当前日期追加到 audit.log。
- 用 names.txt 作为 sort 的 stdin,并把结果显示在终端。
- 全盘查找 config.txt,正常结果显示,错误写入 denied.txt。