LinuxI/O重定向简介

来自菜鸟教程
跳转至:导航、​搜索

介绍


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


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

  • 标准输入 (stdin)
  • 标准输出 (stdout)
  • 标准错误 (stderr)

流也有编号:

  • 标准输入 (0)
  • 标准输出 (1)
  • 标准错误 (2)

在用户与终端的标准交互过程中,标准输入通过用户的键盘进行传输。 标准输出和标准错误以文本形式显示在用户终端上。 这三个流统称为标准流

标准输入


标准输入流通常将数据从用户传送到程序。 期望标准输入的程序通常接收来自设备的输入,例如键盘。 标准输入在到达 EOF(文件结尾)时终止。 如其名称所述,EOF 表示没有更多数据要读取。

要查看实际的标准输入,请运行 cat 程序。 Cat 代表 concatenate,意思是链接或组合某些东西。 它通常用于组合两个文件的内容。 当单独运行时,cat 打开一个循环提示。

cat

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

1
2
3
ctrl-d

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

用户可以通过按 ctrl-d 输入 EOF。 cat 程序收到 EOF 后停止。

标准输出


标准输出写入程序生成的数据。 当标准输出流没有被重定向时,它会将文本输出到终端。 试试下面的例子:

echo Sent to the terminal through standard output

当不带任何附加选项使用时,echo 命令会显示在命令行上传递给它的任何参数。 参数是程序接收到的东西。

运行 echo 不带任何参数:

echo

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

标准误差


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

当一个程序的标准错误流通过管道传输到第二个程序时,管道数据(由程序错误组成)也同时发送到终端。

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

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

ls % 

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

ls: cannot access %: No such file or directory

流重定向


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

带有单括号 的命令覆盖 目标的现有内容。

覆盖

  • > - 标准输出
  • < - 标准输入
  • 2> - 标准错误

带有双括号 的命令不会 覆盖目标的现有内容。

附加

  • >> - 标准输出
  • << - 标准输入
  • 2>> - 标准错误

让我们看一个例子:

cat > write_to_me.txt
a
b
c
ctrl-d

在这里, cat 用于写入文件,该文件是循环创建的。

使用 cat 查看 write_to_me.txt 的内容:

cat write_to_me.txt

它应具有以下内容:

a
b
c

再次将 cat 重定向到 write_to_me.txt,并输入三个数字。

cat > write_to_me.txt
1
2
3
ctrl-d

当您使用 cat 查看 write_to_me.txt 时,您会看到以下内容:

1
2
3

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

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

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

再次打开 write_to_me.txt,你会看到:

1
2
3
a
b
c

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

管道


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

Linux pipe 用竖线表示。

*|*

使用管道的命令示例:

ls | less

这将获取 ls 的输出,它显示当前目录的内容,并将 pipes 输出到 less 程序。 less 一次显示一行发送给它的数据。

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

尽管管道的功能可能看起来类似于 >>>(标准输出重定向),但区别在于管道将数据从一个命令重定向到另一个命令,而>>> 用于专门重定向到文件。

过滤器


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

  • find - Find 返回文件名与传递给 find 的参数匹配的文件。
  • grep - Grep 返回与传递给 grep 的字符串模式匹配的文本。
  • tee - Tee 将标准输入重定向到标准输出和一个或多个文件。
  • tr - tr 查找并用另一个字符串替换。
  • wc - wc 统计字符、行和单词。

例子


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

命令 > 文件

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

ls ~ > root_dir_contents.txt

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

命令 > /dev/null

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

ls > /dev/null

此命令通过将命令 ls 返回的标准输出流传递给 /dev/null 来丢弃它。

命令 2> 文件

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

mkdir '' 2> mkdir_log.txt

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

命令>>文件

此模式将命令的标准输出重定向到文件 而不会覆盖文件的现有内容。

echo Written to a new file > data.txt
echo Appended content to an existing file >> 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 命令,然后将 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 command | 少。 例如:

man tee | less

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

谷歌搜索特定的命令,或者你想在命令行中做的事情(例如 当您需要使用命令行完成特定任务时,“删除目录中以大写字母开头的所有文件”也很有帮助。

大卫·科拉佐