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