AI 助教问 AI 助教
东方瑞通 · 红帽RHCE

Shell 输入输出重定向与管道

重定向把命令的输出写到文件或把文件内容作为输入;管道把前一个命令的输出作为后一个命令的输入。

考点精讲

  1. 重定向通过「>」「>>」「<」把命令的标准输出或标准输入接到文件上:> 覆盖写入(会清空原内容),>> 追加写入,< 把文件内容作为命令输入;「2>」重定向标准错误,「2>&1」把错误输出合并到标准输出,常用于「命令 > file 2>&1」一次性收集全部输出。管道 | 把前一个命令的标准输出直接作为后一个命令的标准输入,可串联多个命令(如 cat file | grep 关键词)。理解 stdin(0)、stdout(1)、stderr(2)三个文件描述符,是正确使用重定向与管道的前提。

记忆技巧

「大于号写出去、小于号读进来、2 管错误、| 串联」。
三个文件描述符记「0 进、1 出、2 错」,2>&1 把「2 错」并到「1 出」。
> 覆盖、>> 追加——两个大于号「更长」所以是「追加」。

常见误区

  • 误区:混淆 >(覆盖)与 >>(追加)。正解:> 覆盖会清空原文件,>> 追加保留原内容。
  • 误区:忘记用 2>&1 导致只重定向了正常输出。正解:要同时收集错误与正常输出,用 cmd > file 2>&1。
  • 误区:写错 2>&1 的顺序。正解:2>&1 必须写在重定向目标之后(cmd > file 2>&1),写反会丢失错误输出。

真题思路

  • 【示例】 需要把命令的「正常输出和错误输出」同时追加写入 /tmp/log,正确的写法是?
    A. cmd > /tmp/log 2>&1 B. cmd >> /tmp/log 2>&1 C. cmd 2>&1 > /tmp/log D. cmd > /tmp/log 2> /dev/null
    答案:B
    解析:追加写入用 >>,2>&1 把 stderr 合并到 stdout,且顺序上 2>&1 要写在 >> 之后才正确;A 是覆盖写;C 顺序错误会丢失错误输出。

常见问题

Q:怎么同时把正常和错误输出写到同一文件

A:cmd > file 2>&1。

Q:怎么把错误输出单独丢弃

A:cmd 2> /dev/null。

Q:管道和重定向有什么区别

A:管道把前命令输出传给后命令输入,重定向把输出写到文件或从文件读入。

相关知识

教材出处:RH124 第4章 Shell 输入输出重定向与管道

AI 助教

让 AI 助教带你深入学习,把你卡住的地方直接问它

随时为您答疑解惑

开始答疑