Linux/Unix 中的输入输出重定向示例

重定向是网络最有用的功能之一。 Linux Unix shell 也支持这种机制,因为它允许你决定命令从哪里读取输入以及将输出发送到哪里。本页将通过示例解释输出、输入和错误重定向。
什么是重定向?
重定向是 Linux 中的一项功能,它允许你在执行命令时更改标准输入和输出设备。任何程序的基本工作流程都离不开重定向。 Linux 命令 它接受一个输入并给出一个输出。
- 标准输入 (stdin) 设备是键盘。
- 标准输出 (stdout) 设备是屏幕。
通过重定向,可以改变上述标准输入和输出。
输出重定向
下图标志着输出重定向示例的开始。
“>”符号用于输出(STDOUT)重定向。
计费示例:
ls -al > listings
这里,ls -al 命令的输出结果被重定向到名为“listings”的文件,而不是显示在屏幕上。下面的屏幕截图显示了结果。
注意:将命令输出重定向到文件时,请使用正确的文件名。如果同名文件已存在,重定向的命令会先删除该文件的内容,然后再覆盖它。
如果您不想覆盖现有文件,而是想向其中添加更多内容,请使用“>>”运算符。下面的屏幕截图显示了添加“>>”后的内容。
你可以将标准输出重定向到文件,还可以重定向到设备。
$ cat music.mp3 > /dev/audio
cat 命令读取音乐文件。mp3 并将输出发送到 /dev/audio,即音频设备。如果您的电脑声音配置正确,此命令将播放音乐文件。mp3.
输入重定向
下图介绍了输入重定向。
“<”符号用于输入(STDIN)重定向。
例如:Linux 中的邮件程序可以帮助你从终端发送电子邮件。
您可以使用键盘(标准输入设备)输入电子邮件内容。但如果您想将文件附加到电子邮件中,可以使用以下格式的输入重定向运算符。
mail -s "Subject" to-address < Filename
下面的屏幕截图显示了邮件命令读取文件作为输入。
这样就把文件作为附件添加到电子邮件中,并发送给收件人。
以上示例都很简单。现在来看一些利用文件描述符的高级重定向技术。
文件 Descriptors (FD)
在 Linux 和 Unix 系统中,一切皆文件。普通文件、目录,甚至设备都是文件。每个文件都有一个关联的编号,称为文件描述符 (FD)。
下图显示了标准流及其文件描述符。
你的屏幕也有一个文件描述符。当程序运行时,输出会被发送到屏幕的文件描述符,然后你就能在显示器上看到程序输出。如果输出发送到打印机的文件描述符,程序输出就会被打印出来。
错误重定向
无论何时在终端执行程序或命令,始终有三个文件处于打开状态,即标准输入、标准输出和标准错误。
这些文件在程序运行时始终存在。如前所述,每个文件都关联着一个文件描述符。
| 文件 | 文件 Descriptor |
|---|---|
| 标准输入 STDIN | 0 |
| 标准输出 STDOUT | 1 |
| 标准错误 STDERR | 2 |
默认情况下,错误信息会显示在屏幕上。错误重定向会将错误信息输出到屏幕以外的文件。
为什么要进行错误重定向?
错误重定向是 Unix 和 Linux 系统中非常流行的功能之一。
经常使用 Unix 的用户都知道,很多命令都会产生大量错误。例如,在搜索文件时,通常会遇到各种问题。 允许 被拒绝的错误通常对查找特定文件的用户没有帮助。在执行 shell 脚本时,您通常不希望错误消息干扰正常的程序输出。
解决方法是将错误信息重定向到一个文件中。
例子1
$ myprogram 2>errorsfile
下面这张截图显示了终端中的这条命令。
上面我们执行一个名为 myprogram 的程序。标准错误输出的文件描述符是 2。使用“2>”,我们将错误输出重定向到名为“errorsfile”的文件。这样,程序输出就不会被错误信息淹没。
例子2
以下是使用 find 语句的另一个示例。
find . -name 'my*' 2>error.log
使用 find 命令,我们在当前目录“.”中搜索名称以“my”开头的文件,并将任何错误发送到 error.log。
例如3: 让我们来看一个更复杂的例子。
服务器管理员经常会列出目录,并将错误输出和标准输出都存储在一个文件中,以便稍后处理。以下是相关命令。
ls Documents ABC> dirlist 2>&1
下图显示了两个数据流被捕获到一个文件中的情况。
这里:
- 2>&1 表示 STDERR 重定向到与 STDOUT 相同的目标(即文件目录列表)。
- 错误输出被重定向到标准输出,标准输出又被重定向到文件目录列表。因此,这两个流都会被写入文件目录列表。
下图总结了输入、输出和错误重定向是如何协同工作的。






.png)