介绍到Linux I / O重定向

Linux内置的重定向功能为您提供了一套强大的用来做任务的种种更容易实现的工具。无论您是通过命令行编写复杂的软件或执行文件管理,知道如何操作不同的I / O流在你的环境将大大提高工作效率。

介绍


Linux中内置的重定向功能为您提供了一套强大的工具,用于使各种任务更容易完成。 无论您是通过命令行编写复杂软件还是执行文件管理,知道如何处理环境中不同的I / O流都将大大提高您的生产力。


Linux环境中的输入和输出分布在三个流中。 这些流是:

  • 标准输入 (stdin)

  • 标准输出 (stdout)

  • 标准错误错误

流也编号:

  • 标准输入 (0)

  • 标准输出 (1)

  • 标准错误 (2)

在用户和终端之间的标准交互期间,通过用户的键盘发送标准输入。 标准输出和标准错误作为文本显示在用户终端上。 统称为三个流被称为标准流

标准输入


标准输入流通常将数据从用户携带到程序。 期望标准输入的程序通常从诸如键盘的设备接收输入。 标准输入通过到达EOF(文件结束)来终止。 如它的名称所描述的,EOF表示没有更多的数据要被读取。

在行动中看到标准输入,运行cat程序。 Cat代表连接,这意味着链接或组合的东西。 它通常用于组合两个文件的内容。 当自己运行时,cat打开循环提示。

cat

打开cat后,在运行时键入一系列数字。

1
2
3
ctrl-d

当您键入数字并按Enter键时,将向正在运行的cat程序发送标准输入,该程序正在等待输入。 反过来,cat程序将您的输入作为标准输出发送回终端显示。

EOF可以由用户通过按ctrl-d输入。 在猫程序接收到EOF之后,它停止。

标准输出


标准输出写入由程序生成的数据。 当标准输出流未被重定向时,它将向终端输出文本。 尝试以下示例:

echo Sent to the terminal through standard output

当没有任何附加选项一起使用,echo命令将显示传递给它的命令行上的任何参数。 参数是程序接收的。

运行echo没有任何参数:

echo

它将返回一个空行,因为没有参数。

标准错误


标准错误写入由在其执行的某个时刻失败的程序生成的错误。 与标准输出一样,此流的默认目标是终端显示。

当程序的标准错误流被管道传送到第二程序时,管道数据(包括程序错误)也同时发送到终端。

让我们来看看使用ls命令标准错误的一个基本的例子。LS列出一个目录的内容。

当不带参数运行时,ls列出当前目录中的内容。 如果ls以目录作为参数运行,它将列出所提供目录的内容。

ls % 

由于%不是现有目录,这将发送以下文本到标准错误:

ls: cannot access %: No such file or directory

流重定向


Linux包括每个流的重定向命令。 这些命令将标准输出写入文件。 如果定位不存在的文件(通过单括号或双括号命令),则在写入之前将创建具有该名称的新文件。

用一个支架命令覆盖目标的现有内容。

覆盖

  • > -标准输出

  • < -标准输入

  • 2> -标准误差

用双支架命令覆盖目标的现有内容。

附加

  • >> -标准输出

  • << -标准输入

  • 2 >> -标准误差

让我们看一个例子:

cat > write_to_me.txt
a
b
c
ctrl-d

这里,cat用于写入文件,该文件是循环的结果。

查看写的内容,用 me.txt:

cat write_to_me.txt

它应该有以下内容:

a
b
c

重定向猫再次写入me.txt,并输入三个数字。

cat > write_to_me.txt
1
2
3
ctrl-d

当您使用的猫来查看写入 me.txt,你会看到以下内容:

1
2
3

之前的内容不再存在,因为该文件被单括号命令覆盖。

再做一次cat重定向,这次使用双括号:

cat >> write_to_me.txt
a
b
c
ctrl-d

打开写再次 me.txt,你会看到这一点:

1
2
3
a
b
c

该文件现在包含cat的两种用法的文本,因为第二个没有覆盖第一个。

管道


管道用于将流从一个程序重定向到另一个程序。 当程序的标准输出通过管道发送到另一个程序时,由第二程序接收的第一程序的数据不会显示在终端上。 只显示第二个程序返回的过滤数据。

Linux的管道用竖线表示。

*|*

使用管道的命令示例:

ls | less

这需要LS的输出,显示当前目录中的内容,和管道less程序。 less一次一行地显示发送给它的数据。

ls通常在多行中显示目录内容。 当你通过less运行它,每个条目放在一个新行。

虽然管的功能可能会显示为相似,即>>>(标准输出重定向),则区别在于管从一个命令重定向数据到另一个,而>>>用于只重定向到文件。

过滤器


过滤器是改变管道重定向和输出命令。 请注意,过滤器命令也是可以在没有管道的情况下使用的标准Linux命令。

  • 查找 -查找返回文件相匹配通过寻找论据的文件名。

  • grep的 - grep的返回传递到grep字符串模式匹配的文本。

  • 三通 -三通重定向标准输入到标准输出和一个或多个文件。

  • TR - TR发现-和替换用一个字符串另一回事。

  • 厕所 -厕所计数字符,线条和文字。

例子


现在您已经介绍了重定向,管道和基本过滤器,让我们看看一些基本的重定向模式和示例。

命令>文件

此模式将命令的标准输出重定向到文件。

ls ~ > root_dir_contents.txt

上面的命令传递系统的根目录为标准输出的内容,并输出写入根目录文件contents.txt命名。 它将删除文件中的任何先前内容,因为它是单括号命令。

命令> / dev / null

/ dev / null是一个特殊的文件,用于删除重定向到它的任何数据。 它用于丢弃不需要的标准输出,否则可能会干扰命令或脚本的功能。 发送到/ dev / null的任何输出都将被丢弃。
在将来,您可能会发现在编写shell脚本时将标准输出和标准错误重定向到/ dev / null的做法。

ls > /dev/null

该命令放弃将它传递到/ dev / null,以从命令ls返回的标准输出流。

命令2>文件

此模式将命令的标准错误流重定向到文件,覆盖现有内容。

mkdir '' 2> mkdir_log.txt

此重定向由无效的目录名'引发的错误,并将其写入到log.txt中。 注意,错误仍然发送到终端并显示为文本。

命令>>文件

这种模式重定向命令的标准输出到一个文件,而不会覆盖该文件的现有内容。

echo Written to a new file > data.txt
echo Appended to an existing file's contents >> data.txt

这对命令首先将用户通过echo输入的文本重定向到一个新文件。 然后,将第二个echo命令接收的文本附加到现有文件,而不覆盖其内容。

命令2 >>文件

该模式应用到文件的命令的标准错误流重定向以上覆盖该文件的现有内容。 此模式对于创建程序或服务的错误日志很有用,因为日志文件将不会在每次写入文件时擦除先前的内容。

find '' 2> stderr_log.txt
wc '' 2>> stderr_log.txt

上述命令将由无效find参数引起的错误消息重定向到名为stderr_log.txt的文件。 然后将由无效wc参数引起的错误消息附加到同一个文件。

命令| 命令

将标准输出从第一个命令重定向到第二个命令的标准输入。

find /var lib | grep deb

通过/ VAR此命令搜索及其子文件夹的文件名和扩展匹配字符串DEB,并返回文件的文件路径,每个路径的匹配部分以红色突出显示。

命令| 三通文件

这种模式(包括tee命令)命令的标准输出重定向到一个文件并覆盖其内容。 然后,它在终端中显示重定向的输出。 如果文件不存在,它将创建一个新文件。

在此模式的上下文中,tee通常用于查看程序的输出,同时将其保存到文件。

wc /etc/magic | tee magic_count.txt

这管理了魔术文件(由Linux shell用来确定文件类型)中的字符,行和单词的计数到tee命令,tee命令然后将wc的输出分为两个方向,并将其发送到终端显示和magic_count .txt文件。 对于tee命令,假设字母T。字母的底部是初始数据,顶部是分割在两个不同方向(标准输出和终端)的数据。

多个管道可用于将输出重定向到多个命令和/或过滤器。

命令| 命令| 命令>>文件

此模式预定义第一个命令的标准输出,并通过接下来的两个命令对其进行过滤。 然后将最终结果附加到文件。

ls ~ | grep *tar | tr e E >> ls_log.txt

这是从您的根目录(〜)中运行ls并将结果传递给grep命令开始的。 在这种情况下,grep的返回包含在其文件名或扩展tar文件的列表。

然后从grep的结果通过管道输送到TR,它取代有E字母e的出现,因为e的被作为第一个参数传递(字符串搜索)和E作为第二个参数(即替换字符串传递第一个参数的任何匹配项)。 然后将最终结果附加到文件ls_log.txt,如果它不存在,则创建该文件)。

结论


学习如何使用Linux命令行中内置的重定向功能可能有点令人生畏,但是在完成本教程后,您可以很好地掌握这种技能。 现在你已经看到了重定向和管道如何工作的基础知识,你将能够开始进入shell脚本世界,这使得经常使用本指南中强调的程序和模式。

如果您想深入了解本教程中介绍的命令,你可以用man命令这样做| 例如:

man tee | less

这将显示可用于T恤程序的命令的完整列表。 您可以使用此模式显示任何Linux命令或程序的信息和使用选项。

搜索特定命令,或者您想在命令行中执行的操作(例如,“删除以大写字母开头的目录中的所有文件”)也可以证明在您需要使用命令完成特定任务时很有用线。

作者:David Collazo