重定向与管道是什么
重定向与管道是 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。