Linux 输入输出重定向

什么是重定向?

重定向是 Linux 中的一项功能,因此在执行命令时,你可以更改标准输入/输出设备。任何 Linux 命令的基本工作流程都是它接受输入并提供输出。

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

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

输出重定向

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

例:

ls -al > listings

这里命令 ls -al 的输出被重定向到文件 listing 而不是你的屏幕。

注意:在将命令输出重定向到文件时使用正确的文件名。如果存在具有相同名称的现有文件,则重定向命令将删除该文件的内容,文件被覆盖。

如果你不希望覆盖文件但想要向现有文件添加内容,则应使用 > > 操作符。

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

$ cat music.mp3 > /dev/audio

cat 命令读取文件 music.mp3 并将输出发送到作为音频设备的 /dev/audio。如果 PC 中的声音配置正确,此命令将播放 music.mp3 文件

输入重定向

< 符号用于输入(STDIN)重定向

比如,Linux 中的邮件程序可以帮助你从终端发送电子邮件。

Mail -s "Subject" to-address < Filename

你可以使用标准设备键盘键入电子邮件的内容。但是,如果要将文件附加到电子邮件,则可以使用上面格式的输入重定向运算符。

这会将文件附加到电子邮件中,然后将其发送给收件人。

上面的例子很简单。让我们看一下使用文件描述符的一些先进的重定向技术。

文件描述符(FD)

在 Linux/Unix 中,一切都是文件。常规文件、目录、甚至设备都是文件。每个文件都有一个称为文件描述符(FD)的关联编号。

你的屏幕还有一个文件描述符。执行程序时,输出将被发送到屏幕的文件描述符,你可以在显示器上看到程序输出。如果输出发送到打印机的文件描述符,则程序输出将被打印。

错误重定向

无论何时在终端执行程序/命令,都会打开 3 个文件,即标准输入、标准输出、标准错误

运行程序时,这些文件始终存在。如前所述,文件描述符与这些文件中的每一个相关联。

文件 文件描述符
标准输入 STDIN 0
标准输出 STDOUT 1
标准错误 STDERR 2

默认情况下,错误流显示在屏幕上。错误重定向将错误路由到屏幕以外的文件。

为什么错误重定向?

错误重定向是 Unix/Linux 的一个非常流行的功能。

UNIX 的用户经常会认为许多命令会给你带来大量的错误。

  • 例如,在搜索文件时,通常会获得权限拒绝错误。这些错误通常无助于搜索特定文件的人。
  • 执行 shell 脚本时,通常不希望错误消息使正常的程序输出变得混乱。

解决方案是将错误消息重定向到文件。

例 1

$ myprogram 2 > errorsfile

上面我们正在执行一个名为 myprogram 的程序,标准错误的文件描述符是 2。使用 2 > 我们将错误输出重定向到名为 errorfile 的文件

因此,程序输出不会再有出错信息。

例 2

这是另一个使用 find 语句的例子 -

find . -name 'my*' 2>error.log

使用 find 命令,我们可以来搜索当前目录下文件名以 my 开头的文件。

错误信息将被重定向到文件 error.log

例 3

让我们看一个更复杂的例子,

服务器管理员经常列出目录并将错误和标准输出存储到文件中,以后可以进行处理。以下是命令。

ls Documents ABC> dirlist 2>&1

这里,

  • 将一个文件的输出写入另一个文件的输入。 2 >&1 表示错误信息被重定向到 STDOUT 的目标(这是文件 dirlist
  • 我们将错误输出重定向到标准输出,而标准输出又被重定向到文件转向器。因此,输出都写入文件 dirlist

复习

  • Linux 中的每个文件都有一个与之关联的相应文件描述符
  • 键盘是标准输入设备,而屏幕是标准输出设备
  • > 是输出重定向运算符。 >> 将输出附加到现有文件
  • < 是输入重定向运算符
  • >& 将一个文件的输出重定向到另一个文件。
  • 你可以使用相应的文件描述符 2 来重定向错误。