Linux I/O 重定向

17 Mar 2025 | 阅读 2 分钟

重定向可以定义为改变命令从何处读取输入以及命令将输出发送到何处。您可以重定向命令的输入和输出。

重定向使用元字符。重定向可以指向 **文件**(shell 元字符是尖括号 '<'、'>')或 **程序**(shell 元字符是 **管道** 符号 '|')。


I/O 重定向中的标准流

bash shell 在 I/O 重定向中有三个标准流

  • 标准输入 (stdin) : stdin 流编号为 stdin (0)。bash shell 从 stdin 读取输入。默认情况下,键盘用作输入。
  • 标准输出 (stdout) : stdout 流编号为 stdout (1)。bash shell 将输出发送到 stdout。输出显示在屏幕上。
  • 标准错误 (stderr) : stderr 流编号为 stderr (2)。bash shell 将错误消息发送到 stderr。错误消息显示在屏幕上。

重定向到文件

每个流都使用重定向命令。可以使用单个括号 '>' 或双个括号 '>>' 来重定向标准输出。如果目标文件不存在,将创建一个同名的新文件。

覆盖

带有单个括号 **'>'** 的命令会 **覆盖** 现有文件的内容。

  • > : 标准输出
  • < : 标准输入
  • 2> : 标准错误

注意:写入 **'1>'** 或 **'>'** 以及 **'0<'** 或 **'<'** 是相同的。但对于 stderr,您必须写入 **'2>'**。

语法

示例

Linux I/O Redirection1

查看上面的截图,命令 "cat > sample.txt" 已创建包含内容 'a, b, c' 的 'sample.txt' 文件。使用命令 **"cat > sample.txt"** 再次创建相同的 'sample.txt' 文件,这次它覆盖了先前的文件内容,并且只显示 'd, e, f'。


Append

带有双括号 **'>>'** 的命令 **不会覆盖** 现有文件的内容。

  • >> - 标准输出
  • << - 标准输入
  • 2>> - 标准错误

语法

示例

Linux I/O Redirection2

查看上面的截图,这里我们使用命令 **"cat >> sample.txt"** 再次创建了两个同名文件。但这次,内容没有被覆盖,所有内容都被显示出来了。


重定向到程序

管道将一个 **程序** 的流重定向到另一个程序。当使用管道将一个程序的标准输出发送到另一个程序时,第一个程序的数据不会显示在终端上,只有第二个程序的数据会显示出来。

尽管管道的功能可能看起来与 '>' 和 '>>' 相似,但它们有显著的区别。管道将数据从一个程序重定向到另一个程序,而括号仅用于文件的重定向。

示例

Linux I/O Redirection3

查看上面的截图,命令 **"ls *.txt | cat > txtFile"** 将所有 '.txt' 文件放入一个新创建的文件 'txtFile' 中。