Linux - 标准 I/O 流



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

  • 标准输入流 (Stdin)
  • 标准输出流 (Stdout)
  • 标准错误流 (Stderr)
Linux - Standard I/O Streams

如前所述,在 Linux 中,一切皆为文件。例如目录、普通文件,甚至设备都被视为特殊文件。每个文件都有一个关联的数字,称为文件描述符或简称 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 文件中。

广告