网站搜索

了解 Linux I/O(输入/输出)重定向工作原理的基础知识


Linux 管理中最重要和最有趣的主题之一是 I/O 重定向。命令行的这一功能使您能够将命令的输入和/或输出重定向到文件和/或文件,或者使用管道将多个命令连接在一起以形成所谓的“命令管道” 。

我们运行的所有命令基本上都会产生两种输出:

  1. 命令结果 - 程序设计产生的数据,以及
  2. 通知用户程序执行详细信息的程序状态和错误消息。

在 Linux 和其他类 Unix 系统中,有以下三个默认文件,shell 也使用文件描述符编号来识别它们:

  1. stdin 或 0 – 它连接到键盘,大多数程序从此文件读取输入。
  2. stdout 或 1 – 它附加到屏幕上,所有程序将其结果发送到此文件,并且
  3. stderr 或 2 – 程序将状态/错误消息发送到该文件,该文件也附加到屏幕上。

因此,I/O 重定向允许您更改命令的输入源以及其输出和错误消息发送到的位置。这是通过 “< ”“> ” 重定向运算符实现的。

如何在 Linux 中将标准输出重定向到文件

您可以重定向标准输出,如下例所示,在这里,我们要存储 top 命令的输出以供以后检查:

top -bn 5 >top.log

标志所在:

  1. -b – 使top能够以批处理模式运行,以便您可以将其输出重定向到文件或其他命令。
  2. -n – 指定命令终止前的迭代次数。

您可以使用cat命令查看top.log文件的内容,如下所示:

cat top.log

要附加命令的输出,请使用 “>> ” 运算符。

例如,要将上面 top 命令的输出附加到 top.log 文件中,特别是在脚本内(或在命令行上),请输入以下行:

top -bn 5 >>top.log

注意:使用文件描述符编号,上面的输出重定向命令与以下内容相同:

top -bn 5 1>top.log

如何在 Linux 中将标准错误重定向到文件

要重定向命令的标准错误,您需要显式指定文件描述符编号 2 以便 shell 理解您要执行的操作。

例如,当没有 root 权限的普通系统用户执行下面的 ls 命令时,将产生错误:

ls -l /root/

您可以将标准错误重定向到文件,如下所示:

ls -l /root/ 2>ls-error.log
cat ls-error.log 

要附加标准错误,请使用以下命令:

ls -l /root/ 2>>ls-error.log

如何将标准输出/错误重定向到一个文件

还可以将命令的所有输出(标准输出和标准错误)捕获到单个文件中。这可以通过指定文件描述符编号以两种可能的方式完成:

1. 第一种是相对较旧的方法,其工作原理如下:

ls -l /root/ >ls-error.log 2>&1

上面的命令意味着 shell 首先将 ls 命令的输出发送到文件 ls-error.log (使用 >ls-error.log),然后写入所有错误消息都发送到文件描述符 2(标准输出),该描述符已被重定向到文件 ls-error.log(使用 2>&1 )。这意味着标准错误也被发送到与标准输出相同的文件。

2.第二种直接方法是:

ls -l /root/ &>ls-error.log

您也可以将标准输出和标准错误附加到单个文件,如下所示:

ls -l /root/ &>>ls-error.log

如何将标准输入重定向到文件

大多数(如果不是全部)命令从标准输入获取输入,并且默认情况下标准输入附加到键盘。

要从键盘以外的文件重定向标准输入,请使用 “< ” 运算符,如下所示:

cat <domains.list 

如何将标准输入/输出重定向到文件

您可以使用 sort 命令同时执行标准输入、标准输出重定向,如下所示:

sort <domains.list >sort.output

如何通过管道使用 I/O 重定向

要将一个命令的输出重定向为另一个命令的输入,您可以使用管道,这是为复杂操作构建有用命令行的强大方法。

例如,下面的命令将列出最近修改的前五个文件。

ls -lt | head -n 5 

在这里,选项:

  1. -l – 启用长列表格式
  2. -t – 按修改时间排序,最新的文件先显示
  3. -n – 指定要显示的标题行数

构建管道的重要命令

在这里,我们将简要回顾一下构建命令管道的两个重要命令,它们是:

xargs 用于从标准输入构建和执行命令行。下面是一个使用 xargs 的管道示例,该命令用于将文件复制到 Linux 中的多个目录中:

echo /home/aaronkilik/test/ /home/aaronkilik/tmp | xargs -n 1 cp -v /home/aaronkilik/bin/sys_info.sh

以及选项:

  1. -n 1 – 指示 xargs 每个命令行最多使用一个参数并发送到 cp 命令
  2. cp – 复制文件
  3. -v – 显示复制命令的进度。

有关更多使用选项和信息,请阅读 xargs 手册页:

man xargs 

tee 命令从标准输入读取并写入标准输出和文件。我们可以演示 tee 的工作原理,如下所示:

echo "Testing how tee command works" | tee file1 

文件或文本过滤器通常与管道一起使用,以进行有效的 Linux 文件操作,以强大的方式处理信息,例如重组命令输出(这对于生成有用的 Linux 报告至关重要)、修改文件中的文本以及其他一些 Linux 系统管理任务。

要了解有关 Linux 过滤器和管道的更多信息,请阅读本文查找访问 Apache 服务器的前 10 个 IP 地址,其中显示了使用过滤器和管道的有用示例。

在本文中,我们解释了 Linux 中 I/O 重定向的基础知识。请记住通过下面的反馈部分分享您的想法。