首页/系统/Linux 运维命令速查/重定向与管道(> >> 2>&1 |)
文件与目录76 条

重定向与管道(> >> 2>&1 |)

把标准输出/错误输出接到文件或其他命令:日志落盘、错误分离、tee 双写,是运维脚本最基础的一层语法。

Linux 运维命令速查系统更新于 2026-10-13

重定向与管道是什么

重定向与管道是 shell 层面的输入输出接线:> 覆盖写入文件、>> 追加、2> 单独重定向标准错误、< 从文件读入,| 把前一个命令的标准输出接到后一个命令的标准输入,tee 把同一条流同时送去屏幕与文件。理解要点是「谁来做重定向」——重定向由当前 shell 在启动命令之前完成,所以 sudo cmd > /etc/foo 这种写法里,写文件这一步仍以当前用户权限执行并会失败,正确做法是用管道交给 sudo tee。

基本信息

适用平台Linux/macOS(POSIX shell 通用;&> 与 &>> 是 bash 扩展)
文件描述符0 标准输入、1 标准输出、2 标准错误
常用写法> 覆盖、>> 追加、2> 重定向错误、< 读入、| 管道、tee 双写
顺序语义2>&1 与 > f 的先后顺序决定输出去向,写反结果完全不同
相关命令tee 双写、logger 写系统日志、exec 在脚本内统一重定向

典型使用场景

  • 日志落盘:任务输出追加到日志文件,供事后排查
  • 错误分流:正常输出与错误输出分别写到不同文件,便于告警只盯错误
  • 管道处理:把命令输出直接交给 grep、awk、sort 做二次加工
  • 双写留档:既要实时看输出又要留一份记录,用 tee
  • 提权写文件:用 sudo tee 解决重定向在 sudo 之外的问题

常用示例

常用示例
cmd > out.log 2>&1          # 标准输出与标准错误都进文件,顺序不能反
cmd >> app.log 2>&1         # 追加模式,日志场景首选
cmd 2>> err.log             # 只把错误追加到 err.log,正常输出仍上屏
cmd1 | cmd2 | tee all.log   # 管道处理并同时留档
sudo tee /etc/foo.conf <<'EOF'   # 提权写文件:重定向在 sudo 之外,必须用 tee
key=1
EOF
exec > /var/log/myscript.log 2>&1   # 脚本内把后续所有输出重定向

常见写法语义

写法含义注意
> f 2>&1标准输出与标准错误都写入 f顺序正确,bash 里也可写 &> f
2>&1 > f标准错误跟着终端,标准输出进 f顺序写反的典型错误
> f覆盖写入,命令执行前先截断文件命令失败时日志也会被清空,慎用
>> f追加写入日志与审计场景应使用这一种
| tee f同时输出到屏幕与文件需要实时观察又要留档时使用
> 的截断发生在命令执行之前:即使命令立刻失败,目标文件也已经被清空。日志类文件一律用 >>,只在确定要重置内容时才用 >。
需要 root 才能写入的目标不要写成 sudo cmd > /etc/foo。shell 会先用普通用户身份打开该文件并失败,正确做法是 cmd | sudo tee /etc/foo。

易错点

  • 把顺序写成 2>&1 > f,结果是错误输出仍留在终端、只有标准输出进文件
  • 日志文件误用 > 覆盖,命令失败时历史记录被清空且无法恢复
  • 管道中某个命令失败不会让整条管道返回失败,脚本需开启 set -o pipefail 才能捕获
  • 大量使用 tee 会写两份数据,在高频输出场景下带来明显额外开销

数据来源与参考

  • man 1 bash(REDIRECTION 章节)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌