1. 三个标准流
| 文件描述符 | 名称 | 说明 |
|---|---|---|
0 (stdin) | 标准输入 | 键盘输入、管道传入的数据 |
1 (stdout) | 标准输出 | 正常输出(如echo、命令结果) |
2 (stderr) | 标准错误 | 错误信息、警告信息 |
所有程序默认拥有这三个“流”,数据以流式(streaming) 方式实时传输。
2. 输出重定向:>和>>
# 覆盖写入文件
command > file.txt # stdout 写入文件(覆盖)
command 2> error.txt # stderr 写入文件
# 追加写入文件
command >> file.txt # stdout 追加到文件
command 2>> error.txt # stderr 追加到文件实际场景:构建日志分离保存
./gradlew assembleDebug > build.log 2> error.logstdout存到build.log;stderr存到error.log。互不干扰,便于分析
3. 流合并:2>&1与&>
# 把 stderr 合并到 stdout
command 2>&1 # stderr → stdout
# 把 stdout 合并到 stderr(少见)
command 1>&2 # stdout → stderr
# 全部输出写入同一个文件(两种写法等价)
command > all.log 2>&1
command &> all.log # bash/zsh 简写形式实际场景:完整构建日志(含错误)保存
./gradlew assembleDebug &> build_all.log4. 丢弃输出:/dev/null
/dev/null是系统约定的“黑洞”设备,写入内容立即丢弃。
# 丢弃 stdout,只看错误
command > /dev/null
# 丢弃 stderr,只看正常输出
command 2> /dev/null
# 全部丢弃(静默执行)
command &> /dev/null实际场景:只关心构建是否成功
./gradlew assembleDebug &> /dev/null && echo "成功" || echo "失败"5. 管道:|
将前一个命令的 stdout 传递给后一个命令的 stdin。
# 基本用法
command1 | command2⚠️ 管道默认只传递 stdout,不传递 stderr!
# 可能漏掉 stderr 中的错误
./gradlew assembleDebug | grep "error"
# 正确:先合并 stderr 到 stdout,再过滤
./gradlew assembleDebug 2>&1 | grep "error"高级用法(bash 4+)
command |& grep "error" # 等价于 command 2>&1 | grep "error"实际场景
./gradlew assembleDebug 2>&1 | grep "^e:" # 只看 Kotlin 编译错误(以 e: 开头)
./gradlew assembleDebug 2>&1 | tail -30 # 查看最后 30 行
./gradlew assembleDebug 2>&1 | tee build.log # 屏幕显示 + 同时保存到文件6. 输入重定向:<、<<、<<<
# 从文件读入
command < input.txt
# Here Document(多行输入)
cat << EOF
第一行
第二行
EOF
# Here String(单行字符串输入)
grep "error" <<< "this is an error line"7. 后台执行:&与nohup
# 后台运行
command &
# 终端关闭后仍继续运行
nohup command &实际场景:后台构建 + 日志记录
nohup ./gradlew assembleDebug &> build.log &之后可用tail -f build.log实时查看进度。
8. 常用组合速查表
| 需求 | 命令 |
|---|---|
| 只看错误 | command > /dev/null |
| 只看正常输出 | command 2> /dev/null |
| 所有输出存文件 | command &> file.log |
| 正常和错误分开存 | command > out.log 2> err.log |
| 过滤所有输出中的关键字 | `command 2>&1 |
| 屏幕看 + 同时存文件 | `command 2>&1 |
| 静默执行,只看退出码 | command &> /dev/null; echo $? |
| 后台运行 + 日志 | nohup command &> file.log & |
9. 执行顺序注意 ⚠️
重定向按从左到右顺序执行,顺序错误会导致行为异常。
✅ 正确:先重定向stdout,再合并stderr
command > file.log 2>&1stdout→file.logstderr→ 当前stdout(即file.log)
❌ 错误:先合并,再重定向
command 2>&1 > file.logstderr→ 原始stdout(终端)stdout→file.log- 结果:错误仍输出到屏幕!
💡 记住口诀:先改 stdout,再改 stderr
常用命令:
./gradlew :repos:business:live:lib-feed-live:compileDebugKotlin 2>&1 | grep "^e:"只看 err
./gradlew assembleDebug -PlibSupportSingle64=true 2>&1 1>/dev/null更新: 2026-03-07 17:23:09
原文: https://www.yuque.com/dongpozhouzi-mshe3/zhm85g/ynxzguyon1tgm54a