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

⚡ 智能摘要

Linux 和 Unix 中的重定向会改变命令读取输入或发送输出的位置,交换ping 键盘和屏幕用于文件或设备,使用大于号、小于号和追加运算符等运算符。

  • 🔀 重定向: 重定向将命令的标准输入或输出从键盘和屏幕更改为文件或设备。
  • ➡️ 输出: > 运算符将输出写入文件,而 >> 运算符将内容追加到现有文件,而不删除该文件。
  • ⬅️ 输入: < 运算符将文件作为标准输入传递给命令,而不是通过键盘输入。
  • 🔢 文件描述符: 每个打开的文件都会被赋予一个数字:0 代表 stdin,1 代表 stdout,2 代表 stderr。
  • ⚠️ 重定向错误: 使用 2> 会将错误消息发送到单独的文件,这样它们就不会干扰正常的输出。
  • 🔗 合并流: 2>&1 语法将标准错误路由到与标准输出相同的目标。
  • 🤖 人工智能帮助: AI 助手和 GitHub Copilot 可以构建和解释重定向命令和 shell 脚本。

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

重定向是网络最有用的功能之一。 Linux Unix shell 也支持这种机制,因为它允许你决定命令从哪里读取输入以及将输出发送到哪里。本页将通过示例解释输出、输入和错误重定向。

什么是重定向?

重定向是 Linux 中的一项功能,它允许你在执行命令时更改标准输入和输出设备。任何程序的基本工作流程都离不开重定向。 Linux 命令 它接受一个输入并给出一个输出。

  • 标准输入 (stdin) 设备是键盘。
  • 标准输出 (stdout) 设备是屏幕。

通过重定向,可以改变上述标准输入和输出。

输出重定向

下图标志着输出重定向示例的开始。

输出重定向部分标题图形

“>”符号用于输出(STDOUT)重定向。

计费示例:

ls -al > listings

这里,ls -al 命令的输出结果被重定向到名为“listings”的文件,而不是显示在屏幕上。下面的屏幕截图显示了结果。

终端显示 ls -al 列表重定向到列表文件

注意:将命令输出重定向到文件时,请使用正确的文件名。如果同名文件已存在,重定向的命令会先删除该文件的内容,然后再覆盖它。

如果您不想覆盖现有文件,而是想向其中添加更多内容,请使用“>>”运算符。下面的屏幕截图显示了添加“>>”后的内容。

终端显示使用双大于号运算符将命令输出追加到现有文件中。

你可以将标准输出重定向到文件,还可以重定向到设备。

$ 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 相同的目标(即文件目录列表)。
  • 错误输出被重定向到标准输出,标准输出又被重定向到文件目录列表。因此,这两个流都会被写入文件目录列表。

下图总结了输入、输出和错误重定向是如何协同工作的。

图表概述了 Linux 和 Unix 中的输入、输出和错误重定向

常见问题

A 管 (|)将一个命令的输出直接作为另一个命令的输入。重定向则将一个命令连接到一个文件或设备,向其中写入输出或从中读取输入。管道连接命令;重定向连接命令和文件。

> 运算符将命令的输出写入文件,替换任何现有内容。>> 运算符则将输出追加到文件末尾。ping 已存在的内容。如果您想向文件中添加内容而不是覆盖它,请使用 >>。

/dev/null 是一个特殊文件,它会丢弃写入其中的所有数据。在命令后添加 2>/dev/null 会将错误信息重定向到该文件,从而静默地丢弃这些错误信息,屏幕上只会显示正常的输出。这是一种常见的隐藏不必要错误信息的方法。

tee 命令从标准输入读取数据,并将数据同时写入屏幕和一个或多个文件,例如 ls -al | tee listing.txt。它允许您在屏幕上查看命令输出的同时,将其保存到文件中。

here 文档使用 << 运算符将多行内联文本作为输入传递给命令,并以您指定的标记词结尾。这在 shell 脚本中非常方便,无需单独的文件即可传递多行输入,例如电子邮件正文。

在重定向输出后,使用 `2>&1` 语法,例如 `command > file 2>&1`,这样标准错误输出就会跟随标准输出写入文件。在现代 Bash 中,简写命令 `&> file` 也能达到同样的效果。顺序很重要:`2>&1` 必须放在输出重定向之后。

人工智能助手可以将简单的英语请求转换成正确的重定向命令,解释诸如 2>&1 或 &> 之类的运算符的作用,并在你执行命令前标记错误。机器学习工具还会扫描重定向日志和错误文件,以发现人工审核可能遗漏的异常情况。

是的。 GitHub 副驾驶 可以根据描述目标的简短注释生成命令和脚本,重定向输入、输出和错误,并在您键入时自动完成它们。 Rev查看任何针对您文件的建议命令,特别是使用 > 覆盖现有数据的命令。

总结一下这篇文章: