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
来重定向错误。