理解 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