Shell重定向通过改变命令的输入输出通道实现文件或设备间的数据传输,核心是标准输入(0)、标准输出(1)和标准错误(2)三个默认通道;支持覆盖(>)、追加(>>)输出,单独重定向错误(2>),合并输出与错误(>&或2>&1),以及从文件读取输入(<)。

Shell重定向就是让命令不从键盘读、不往屏幕写,而是把输入来源或输出目标换成文件、设备甚至其他命令。核心在于三个默认通道:编号0(标准输入,stdin)、1(标准输出,stdout)、2(标准错误,stderr)。理解它们的分工和流向,是用好重定向的关键。
标准输出重定向:覆盖与追加
正常命令结果默认显示在终端上,用 > 和 >> 可以把它导出到文件。
-
> 是覆盖写入:目标文件若存在,内容会被清空重写;不存在则新建。比如
ls -l > file_list.txt把当前目录列表存进去,旧内容全丢。 -
>> 是追加写入:新内容加在文件末尾,原数据不动。适合日志场景,例如
date >> app.log每次运行都记下当前时间。 - 显式写成
1>或1>>效果一样,因为1就是stdout的编号,但通常省略。
标准错误重定向:单独捕获报错信息
命令出错时的提示(比如“Permission denied”“No such file”)走的是stderr(编号2),它不会被 > 影响——这是新手常踩的坑。
- 用 2> 单独捕获错误:例如
find /etc -name "passwd" 2> err.log,只把找不到路径等错误写进文件,正常结果仍打印在屏幕上。 - 用 2>> 追加错误日志,避免每次覆盖,方便长期追踪问题。
- 注意:2> 后面的文件名不能省略,也不能写成
2>空格结尾,否则会报错。
合并输出与错误:统一记录或彻底屏蔽
有时你希望所有信息(成功+失败)都进同一个日志;有时又想只留结果、把错误悄悄扔掉。这两种需求靠组合操作符实现。
-
command > all.log 2>&1:先将 stdout 定向到 all.log,再让 stderr(2)指向 stdout 当前位置(即 all.log)。这是最兼容的写法,所有 Shell 都支持。 -
command &> all.log或command &>all.log:Bash 4.0+ 的简写形式,功能相同,更简洁。 - 想丢弃错误?用
2> /dev/null。/dev/null 是个“黑洞”,写进去就消失。例如ping -c1 google.com 2> /dev/null只保留通或不通的结果,不显示连接失败提示。
标准输入重定向:让命令从文件读,而不是等你敲
很多命令(如 sort、wc、cat)默认从键盘读输入,加上 < 就能自动从文件取数据。
-
sort < data.txt:对 data.txt 内容排序后输出到屏幕,等价于sort data.txt,但语义更明确——它是“读标准输入”,不是“读参数文件”。 -
wc -l < config.conf:统计 config.conf 的行数,不显示文件名,只输出数字。 - 也可以混用:
diff < old.txt > diff_result.txt表示从 old.txt 读输入,把差异结果写进 diff_result.txt。

















