Linux - 标准 I/O 流
标准 I/O 流指的是 Linux 或 Unix 系统默认提供的以下三个流。
- Stdin 流
- Stdout 流
- Stderr 流
如前所述,在 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 文件中。