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.log

stdout存到build.logstderr存到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.log

4. 丢弃输出:/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>&1
  • stdoutfile.log
  • stderr → 当前 stdout(即 file.log

❌ 错误:先合并,再重定向

command 2>&1 > file.log
  • stderr → 原始stdout(终端)
  • stdoutfile.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