Unix 简明教程
Linux - Standard I/O Streams
Standard IO Streams 指的是由任何 Linux 或 Unix 系统默认提供的以下三个流。
-
Stdin Stream
-
Stdout Stream
-
Stderr Stream
如前所解释,在 Linux 中,所有内容都是文件。与目录、常规文件一样,甚至设备都被视为特殊文件。每个文件都有一个关联的数字,称为文件描述符或简称为 FD,此 FD 用于对关联文件执行任何输入或输出操作。
Stdin、Stdout 和 Stderr 是终端屏幕,它们的文件描述符分别为 0、1 和 2。
Stdin Input Stream
这称为标准输入,关联的文件描述符为 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,Stdin 最终会将数据提供给 cat 程序,以便在屏幕上显示。
Stdout Output Stream
这称为标准输出,关联的文件描述符为 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 Error Stream
这称为标准错误,关联的文件描述符为 2。这也表示为 STDERR。Linux 程序将在 STDERR 写入所有错误消息。
默认情况下,STDERR 是你的显示屏,但就像标准输出一样,它也可以被重定向到文件,用于保存错误信息。
让我们尝试使用一个不存在的文件名来执行同样的 cat 命令:
$ cat nonexist.txt
cat: nonexist.txt: No such file or directory
$
在 nonexist.txt 这里文件不存在,因此默认情况下会将错误作为 stderr 显示在屏幕上。
您可以使用文件描述符 5 保存此错误消息,如下所示:
$ cat nonexist.txt 2>err
$
这次您的错误消息保存到 err 文件中。