在linux系统中,stream一般翻译为流,它表示连续不断的数据字节序列。程序运行时通过流来读取外部数据或把结果发送出去,内核和shell共同管理这些通道,让用户能灵活组合命令。

linux中stream的基本含义
stream本质上就是数据的流动通道。linux把很多输入输出设备都抽象成文件,进程通过文件描述符来操作流。最常见的三个标准流如下:
- 标准输入(stdin,文件描述符0):默认来自键盘,程序从中读数据
- 标准输出(stdout,文件描述符1):默认显示到屏幕,程序正常结果写这里
- 标准错误(stderr,文件描述符2):默认显示到屏幕,错误信息写这里
如何使用stream进行重定向
利用shell的重定向符号,可以改变流的方向。例如把命令输出保存到文件,或者从文件读取输入:
# 把ls命令的标准输出写入list.txt ls > list.txt # 把错误输出追加到err.log grep "test" file.txt 2>> err.log # 从input.txt读取标准输入给cat cat < input.txt
管道:连接两个stream
管道符号 | 可以把前一个命令的stdout直接变成后一个命令的stdin,形成流的处理链:
# 查找进程中包含nginx的行并统计数量 ps aux | grep nginx | wc -l
常见命令中的stream处理
像 awk、sed、tr 这类工具都按流的方式逐行处理文本,非常适合处理日志或命令输出。下面用sed把输入流中的abc替换成xyz:
echo "abc def abc" | sed 's/abc/xyz/g'
| 流名称 | 文件描述符 | 默认设备 |
|---|---|---|
| stdin | 0 | 键盘 |
| stdout | 1 | 屏幕 |
| stderr | 2 | 屏幕 |
小结
linux中的stream就是进程间或进程与设备间传输数据的字节流。掌握标准流与重定向、管道的用法,能让你在命令行中高效组合小程序完成复杂任务。