Unix/Linux 标准 I/O 流是怎么回事?怎么使用 stdin stdout stderr?

文章导读
Previous Quiz Next 标准 I/O 流指的是 Linux 或 Unix 系统默认提供的以下三个流。
📋 目录
  1. A Stdin 输入流
  2. B Stdout 输出流
  3. C Stderr 错误流
A A

Linux - 标准 I/O 流



Previous
Quiz
Next

标准 I/O 流指的是 Linux 或 Unix 系统默认提供的以下三个流。

  • Stdin 流
  • Stdout 流
  • Stderr 流
Linux - Standard I/O Streams

如前所述,在 Linux 中,一切皆文件。目录、普通文件,甚至设备都被视为特殊文件。每个文件都有一个关联的数字,称为 File Descriptor(简称 FD),这个 FD 用于对关联文件执行任何输入或输出操作。

Stdin、Stdout 和 Stderr 是终端屏幕,它们的文件描述符分别是 0、1 和 2。

Stdin 输入流

这被称为标准输入,关联的文件描述符是 0。它也被表示为 STDIN。Linux 程序将从 STDIN 读取默认输入。实际上,STDIN 指的是计算机屏幕。

大多数 Linux 命令支持标准 Stdin 流,这意味着我们可以使用 STDIN 直接向程序提供数据,而无需使用文件或命令行输入。

例如,cat 命令将从屏幕读取输入。输入以下命令并开始输入内容:

$ cat
This is text which I'm feeding using STDIN directly.
This is text which I'm feeding using STDIN directly.

$

这里 cat 命令接受标准输入,当你按 Enter 键进入下一行或使用 CTRL+D 退出时,它会将相同的输入打印到显示器上,这是你的标准输出。

当你编写 C、C++ 或 Java 程序并让它暂停从屏幕读取输入时,就会使用 Stdin 流从输入屏幕读取数据。你可以使用输入重定向操作符 < 将数据发送到 Stdin,如下所示:

$ cat < inputfile.txt
This is text which I'm feeding using STDIN directly.


$

上述命令从 inputfile.txt 读取输入并将其重定向到 Stdin,最终提供给 cat 程序在屏幕上显示。

Stdout 输出流

这被称为标准输出,关联的文件描述符是 1。它也被表示为 STDOUT。Linux 程序将默认输出写入 STDOUT。

每当执行 Linux 程序时,其输出会被发送到计算机屏幕的文件描述符,然后你在显示屏上看到。或者,你可以将程序输出发送到任何文件以保存,或发送到打印机进行打印。

以下命令将输出发送到 Stdout,以便在屏幕上显示:

$ ls -l
total 8
-rw-r--r-- 2 root root 132 May  1 07:18 filename
-rw-r--r-- 2 root root 132 May  1 07:18 hardlink
lrwxrwxrwx 1 root root   8 May  1 07:17 symlink -> filename

$

你可以使用输出重定向操作符 > 将输出重定向并保存到文件 output.txt 中,如下所示:

$ ls -l > output.txt


$

或者,你可以使用以下命令:

$ ls -l 1 > output.txt


$

现在输出不会在屏幕上显示。这里我们指定了 1 > output.txt,表示 Stdout 应重定向到 output.txt 文件。系统默认认为它是 Stdout。下一节将区分 Stdout 和 Stderr。

Stderr 错误流

这被称为标准错误,关联的文件描述符是 2。它也被表示为 STDERR。Linux 程序将所有错误消息写入 STDERR。

默认情况下,STDERR 是你的显示屏,但就像标准输出一样,它可以被重定向到文件以保存错误消息。

让我们尝试使用一个不存在的文件名运行相同的 cat 命令:

$ cat  nonexist.txt
cat: nonexist.txt: No such file or directory

$

这里 nonexist.txt 文件不存在,因此错误默认作为 stderr 显示在屏幕上。

你可以使用文件描述符 2 来保存此错误消息,如下所示:

$ cat  nonexist.txt 2>err

$

这次你的错误消息被保存到 err 文件中。