介绍
内置在Linux中的重定向功能为您提供了一套强大的工具,可以优化许多工作流程。软件开发的“Unix哲学”是制作每个都能做一件事情的工具,这种哲学已经延续到了现代命令行工具,这些工具在单独使用时非常强大,当它们结合在一起时更是如此。无论您是在编写复杂的软件还是在命令行上工作,了解如何操纵环境中的不同I/O流将极大地提高您的生产力。
先决条件
要按照本指南操作,您需要访问Linux服务器。如果您需要关于第一次连接服务器的信息,您可以参考我们关于使用SSH连接Linux服务器的指南。
流
在Linux环境中的输入和输出分布在三个流上。这些流包括:
-
标准输入(stdin)
-
标准输出(stdout)
-
标准错误(stderr)
这些流也有编号:
-
stdin(0)
-
stdout(1)
-
stderr(2)
在用户与终端之间的标准交互中,标准输入来自用户键盘。标准输出和标准错误以文本形式显示在用户终端上。这三个流合称为标准流。
标准输入
标准输入流通常携带用户向程序传递的数据。期望标准输入的程序通常从设备(如键盘)接收输入。在本教程的后面部分,您将看到将一个程序的输出作为另一个程序的标准输入的示例。
标准输出
标准输出是由程序生成的输出。当标准输出流未重定向时,它将直接将文本输出到终端。尝试输出一些任意文本,使用echo
:
OutputSent to the terminal
当没有任何额外选项时,echo
命令会输出传递给它的任何参数。
运行没有任何参数的echo:
它将返回一个空行。一些程序没有提供参数时不执行任何操作。
标准错误
标准错误包含由程序生成的失败信息。与标准输出类似,该流的默认目的地是终端显示。
让我们看一个使用ls命令的基本标准错误示例。ls列出目录的内容。
当不带参数运行时,ls会列出当前目录中的内容。如果将ls与目录作为参数一起运行,则会列出所提供目录的内容。
由于%不是现有目录,因此将以下文本发送到标准错误:
Outputls: cannot access %: No such file or directory
A program does not have to crash or finish running in order to generate Standard Error, and whether some output is sent to either Standard Output or Standard Error is down to the behavior of the program. They are not technically different from one another in any way — just that one output stream is supposed to be reserved for error messages, and some tools will assume that Standard Error being empty means that a program ran successfully. Some programs will even output minor errors to Standard Error without crashing or failing to also produce the intended output. It is only used as a convention to separate intended output from unintended output.
流重定向
Linux 包含针对每个流的重定向命令。这些命令可用于将标准输出或标准错误写入文件。如果写入一个不存在的文件,将在写入之前创建具有该名称的新文件。
具有单括号的命令覆盖目标的现有内容。
覆盖
-
> – 标准输出
-
< – 标准输入
-
2> – 标准错误
具有双括号的命令不会覆盖目标的现有内容。
追加
-
>> – 标准输出
-
<< – 标准输入
-
2>> – 标准错误
管道
管道用于将流从一个程序重定向到另一个程序。当一个程序的标准输出通过管道发送到另一个程序时,第一个程序的输出将被用作第二个程序的输入,而不是被打印到终端。只有第二个程序返回的数据将被显示。
Linux的管道由竖线表示:|
以下是使用管道的命令示例:
这将ls
的输出(显示当前目录的内容)管道到less
程序。 less
按行显示发送到它的数据。
ls
通常跨多行显示目录内容。当您通过less运行它时,每个条目都放在新的一行。
虽然管道的功能看起来与>
和>>
类似,但区别在于管道将数据从一个命令重定向到另一个命令,而>和>>仅用于重定向到文件。
过滤器
过滤器是一类通常与另一个程序的输出管道一起使用的程序。它们中的许多也可单独使用,但特别适合说明管道行为。
-
find – 返回与传递给find的参数匹配的文件名。
-
grep – 返回与传递给grep的字符串模式匹配的文本。
-
tee – 将标准输入重定向到标准输出和一个或多个文件。
-
tr – 查找并用另一个字符串替换。
-
wc – 计算字符、行和单词数。
示例
现在您已经了解了重定向、管道和基本过滤器,让我们看一些常见的重定向模式和示例。
command > file
模式将命令的标准输出重定向到一个文件。
上述命令将你的主目录 (~
) 的内容作为标准输出传递,并将输出写入名为 root_dir_contents.txt
的文件。由于它是一个单括号命令,它将删除文件中的任何先前内容。
command > /dev/null
模式将标准输出重定向到空白处。 /dev/null
是一个特殊文件,用于丢弃重定向到它的任何数据。它用于丢弃不需要的标准输出,否则可能会干扰命令或脚本的功能。发送到 /dev/null
的任何输出都会被丢弃。
此命令通过将其传递给 /dev/null 来丢弃从命令 ls 返回的标准输出流。
command 2> file
模式将命令的标准错误流重定向到一个文件,并覆盖现有内容。
此命令将由无效目录名称 ''
引发的错误重定向,并将其写入 log.txt
。请注意,错误仍然会被发送到终端并显示为文本。
command >> file
模式将命令的标准输出重定向到一个文件,而不会覆盖文件的现有内容。
这对命令首先将用户通过 echo 输入的文本重定向到一个新文件。然后,它将第二个 echo 命令接收到的文本追加到现有文件中,而不会覆盖其内容。
上述command 2>> file
模式将命令的标准错误流重定向到一个文件,而不会覆盖文件的现有内容。这种模式对于为程序或服务创建错误日志非常有用,因为每次写入文件时,日志文件都不会被清除其先前的内容。
上述命令将由无效的find参数引起的错误消息重定向到名为stderr_log.txt的文件。然后,它将由无效的wc参数引起的错误消息附加到同一个文件中。
command | command
模式将第一个命令的标准输出重定向到第二个命令的标准输入。
此命令通过/var及其子文件夹搜索与字符串deb
匹配的文件名和扩展名,并返回文件的文件路径,其中每个路径中的匹配部分都以红色突出显示。
command | tee file
模式(包括tee
命令)将命令的标准输出重定向到一个文件并覆盖其内容。然后,在终端中显示重定向的输出。如果文件不存在,则创建一个新文件。
在这种模式的上下文中,tee
通常用于在同时保存到文件的情况下查看程序的输出。
这将/etc/magic
文件中字符、行和单词的计数(Linux shell用于确定文件类型)传送到tee命令,然后将wc
的输出分成两个方向,并将其发送到终端显示和magic_count.txt文件
。对于tee命令,想象一下字母T。字母的底部是初始数据,字母的顶部是数据被分成两个不同方向(标准输出和终端)。
可以使用多个管道将输出重定向到多个命令和/或过滤器。
结论
学习如何使用内置于Linux命令行中的重定向功能是一项关键技能。现在您已经了解了重定向和管道的基础知识,您将能够开始进入Shell脚本的世界,该脚本经常使用本指南中突出的程序和模式。
搜索特定命令,或者您想要在命令行中执行的操作(例如“删除以大写字母开头的目录中的所有文件”),也可能在您需要使用命令行执行特定任务时提供帮助。
Source:
https://www.digitalocean.com/community/tutorials/an-introduction-to-linux-i-o-redirection