← 返回首页

Linux 管道与重定向,把"|"和">"分清楚


title: Linux 管道与重定向,把"|"和">"分清楚 date: 2026-03-25 tag: Linux summary: 一直对 |、> 、>> 、2>&1 这几个符号似懂非懂,一次性整理一下。

刚学 Linux 命令行的时候,我对 |>2>&1 这几个符号的差别一直没分清,每次都靠记忆里"上次哪个能用"来选。后来花了一晚上把它们梳理一遍,从此清楚多了。

管道 |

| 是把前一个命令的标准输出喂给下一个命令的标准输入

ps aux | grep nginx
cat access.log | sort | uniq -c | sort -rn | head -10

注意它只走 stdout,不走 stderr。

重定向 > 与 >>

> 把 stdout 写到文件,覆盖已有内容;>>追加

echo "hello" > a.txt   # a.txt 现在只有 "hello"
echo "world" >> a.txt  # a.txt 现在有 "hello\nworld"

把 stderr 也搞定

默认 > 只重定向 stdout。stderr 是 fd=2,单独写法是 2>

make 2> err.log         # 只把错误存起来
make > out.log 2> err.log  # 各存各的
make > all.log 2>&1     # 合并到一个文件

2>&1 读作"把 fd 2 重定向到 fd 1 当前指向的地方"。注意顺序

make > all.log 2>&1   # ✅ stderr 也进了 all.log
make 2>&1 > all.log   # ❌ stderr 还是打到屏幕,因为它先复制了原 stdout

丢到黑洞里

不想看任何输出,扔掉就完了:

some-noisy-command > /dev/null 2>&1

进程替换

bash 里偶尔用得上的进阶写法 <( )>( ),让一个命令的输出当文件来用:

diff <(sort a.txt) <(sort b.txt)

<(sort a.txt) 实际是个命名管道路径,diff 把它当文件读。

我的小总结

  • | 串接命令;> >> 写文件;2> 单独搞错误流。
  • 2>&1 永远写在 > 后面
  • 想"安静",加 > /dev/null 2>&1 万能。

把这几个符号搞清楚以后,阅读别人的 shell 脚本顺畅了不少。