理解 Linux 中的 stdin、stderr 和 stdout


如果您使用过 Linux 操作系统,那么很有可能遇到过三个著名的数据流,即 **stdin**、**stderr** 和 **stdout**。它们的功能各不相同,用途也各异,但它们之间有一个共同点,那就是它们都是 bash 创建的数据流。

让我们进一步了解数据流的实际含义以及它们如何发挥作用。在计算领域,数据流是指能够将数据从源头传输到输出端,反之亦然的一种机制。源头和输出端是数据流的两个端点。您可能会觉得有趣的是,您在 Linux 终端中运行的任何命令都将位于这两个端点之一。

现在我们对数据流有了一定的了解,让我们进一步了解这三个著名的数据流。

  • **stdin** - 它代表标准输入,用于接收文本作为输入。

  • **stdout** - 它代表标准输出,用于存储您在终端中键入的任何命令的文本输出,然后该输出将存储在 **stdout** 流中。

  • **stderr** - 它代表标准错误。当命令遇到错误时,就会调用它,然后错误消息将存储在此数据流中。

需要注意的是,在 Linux 中,所有这些流都被视为文件。此外,Linux 为每个数据流分配了唯一的值。

  • 0 = stdin

  • 1 = stdout

  • 2 = stderr

现在让我们考虑几个关于这三个数据流的例子。

以下示例描述了一个典型的 **stdin** 流。

命令

read

输出

mmukul@192 Docs-Linux % read
This is to stdin

在上面的命令中,我们向流提供输入,而 read 工具从 stdin 获取输入。

现在,以下显示了 stdout 的一个示例:

命令

ls -ltr

输出

immukul@192 Downloads % ls -ltr
total 1085456
drwxr-xr-x@ 13 immukul staff 416 Dec 7 2019 source-code-pro-release
-rw-r--r--@ 1 immukul staff 350337 Dec 22 2019 messi.jpg
-rw-r--r--@ 1 immukul staff 5953321 Dec 22 2019 927225.png
-rw-r--r--@ 1 immukul staff 601852 Dec 22 2019 238870.jpg
.
.
.

我们知道,我们使用带 **-ltr** 标记的 ls 命令以某种排序方式列出所有文件,其中最后更新的文件显示在底部。该列表被发送到 **stdout** 数据流,然后终端将其打印出来。

现在,以下显示了 **stderr** 的一个示例:

命令

ls -ltr printit

以上命令无效,因为我没有名为 **printit** 的目录,它将生成一条错误消息,该消息将发送到 **stderr**,然后终端将其打印出来。

输出

immukul@192 Downloads % ls -ltr printit
ls: printit: No such file or directory

更新于:2021年7月31日

23K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告