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 脚本顺畅了不少。