Linux I/O 重定向简介

简介

Linux内置的重定向功能为您提供了一套强大的工具来优化许多工作流。软件开发的Unix哲学是让工具各自做好一件事,这一哲学已经被发扬到现代命令行工具上,这些工具各自都很强大,当它们组合在一起时,会成倍增长。无论您是在编写复杂的软件,还是只在命令行上工作,了解如何处理环境中的不同I/O流都将极大地提高您的工作效率。

前提条件

要按照本指南进行操作,您需要能够访问Linux服务器。如果您需要有关第一次连接到服务器的信息,您可以遵循我们关于使用SSH.连接到linux服务器的指南

溪流

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

  • 标准输入 (Stdin)
  • 标准输出 (Stdout)
  • 标准错误 (Stderr)

流也被编号:

stdin* 0** ) stdout ** ( 1** )


在用户和终端之间的标准交互期间,标准输入来自用户的键盘。标准输出和标准误差以文本形式显示在用户终端上。这三个流统称为标准流。

默认输入

标准输入流通常将数据从用户传送到节目。需要标准输入的程序通常从设备(如键盘)接收输入。在本教程的后面部分,您将看到使用一个程序的输出作为另一个程序的标准输入的示例。

==引用=外部链接==

标准输出是由程序生成的输出。当标准输出流没有被重定向时,它将直接将文本输出到终端。尝试输出一些任意文本,使用ECHO

1echo Sent to the terminal
1[secondary_label Output]
2Sent to the terminal

在不带任何附加选项的情况下使用时,ho命令会输出在命令行传递给它的任何参数。

不带任何参数运行ECHO:

1echo

它将返回一个空行。有些程序在没有提供参数的情况下什么也不做。

标准错误

标准错误包含由以某种方式失败的程序生成的错误。与标准输出一样,该流的默认目标是终端显示。

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

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

1ls %

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

1[secondary_label Output]
2ls: cannot access %: No such file or directory

程序不一定要崩溃或完成运行才能生成标准错误,而是将某些输出发送到标准输出还是标准错误取决于程序的行为。它们在技术上没有任何不同-只是一个输出流被认为是为错误消息保留的,并且一些工具将假设标准错误为空意味着程序运行成功。一些程序甚至会将小错误输出到标准错误,而不会崩溃或无法生成预期的输出。它只被用作区分预期输出和非预期输出的约定。

流重定向

Linux包括针对每个流的重定向命令。它们可用于将标准输出或标准错误写入文件。如果写入的文件不存在,则会在写入之前创建一个同名的新文件。

带有单方括号_overwrite_目标的现有内容的命令。

覆盖

*> - 标准输出 *< - 标准输入 *2> - 标准误差

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

追加

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

管道

管道用于将流从一个程序重定向到另一个程序。当一个程序的标准输出通过管道发送到另一个程序时,第一个程序的输出将用作第二个程序的输入,而不是打印到终端。只会显示第二个程序返回的数据。

Linux_PIPE_用竖线表示:|

以下是使用管道的命令示例:

1ls | less

这会将显示当前目录内容的ls的输出和_Pipes_it的输出传递给less程序。`less‘显示发送给它的数据,一次显示一行。

ls通常会分多行显示目录内容。当您运行LESS时,每个条目都放在一个新行上。

虽然管道的功能可能看起来类似于>>>,但区别在于管道将数据从一个命令重定向到另一个命令,而**>** 和** >>** 用于专门重定向到文件。

筛选器

过滤器是一类程序,通常与来自另一个程序的输出一起使用。它们中的许多本身也很有用,但它们特别好地说明了管道行为。

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

示例

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

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

1ls ~ > root_dir_contents.txt

上面的命令将主目录(~)的内容作为标准输出传递,并将输出写入名为root_dir_contents.txt的文件。它将删除文件中以前的所有内容,因为它是一个单括号命令。

命令>/dev/null模式将标准输出重定向到任何地方。/dev/null是一个特殊的文件,用于丢弃任何重定向到它的数据。它用于丢弃不需要的标准输出,否则可能会干扰命令或脚本的功能。所有发送到/dev/null的输出都会被丢弃。

1ls > /dev/null

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

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

1mkdir '' 2> mkdir_log.txt

这将重定向无效目录名‘’引发的错误,并将其写入log.txt。请注意,错误仍将发送到终端并以文本形式显示。

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

1echo Written to a new file > data.txt
2echo Appended content to an existing file >> data.txt

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

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

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

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

COMMAND|COMMAND模式将第一个命令的标准输出重定向到第二个命令的标准输入。

1find /var lib | grep deb

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

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

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

1wc /etc/magic | tee magic_count.txt

该命令将/etc/magic文件(由Linux外壳用来确定文件类型)中的字符、行和单词的计数输送到tee命令,然后该命令将wc‘S的输出分成两个方向,并将其发送到终端显示和magicCount.txt文件。对于tee命令,假设字母T。字母底部是初始数据,顶部是在两个不同方向(标准输出和终端)拆分的数据。

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

结论

学习如何使用Linux命令行中内置的重定向功能是一项至关重要的技能。现在您已经了解了重定向和管道如何工作的基础知识,您将能够开始您的外壳脚本世界之旅,它经常使用本指南中突出显示的程序和模式。

当您需要使用命令行完成特定任务时,搜索特定命令或想要在命令行中执行的操作(例如)也会很有帮助。

Published At
Categories with 技术
Tagged with
comments powered by Disqus