跳转到内容

Ict-创新/LPI/103.4

来自维基教科书,开放世界中的开放书籍

103.4 流、管道和重定向

[编辑 | 编辑源代码]

考生应该能够重定向流并将它们连接起来,以便有效地处理文本数据。任务包括重定向标准输入、标准输出和标准错误,将一个命令的输出管道到另一个命令的输入,使用一个命令的输出作为另一个命令的参数,并将输出发送到标准输出和文件。


关键知识领域

  • 重定向标准输入、标准输出和标准错误。
  • 将一个命令的输出管道到另一个命令的输入。
  • 将一个命令的输出作为另一个命令的参数。
  • 将输出发送到标准输出和文件。

输入、输出、重定向

[编辑 | 编辑源代码]

UNIX 进程使用流来获取输入(标准输入流)、发送输出(标准输出流)以及发送错误消息的流(标准错误流)。这些流可以被任何进程重定向。在大多数情况下,标准输入(stdin)是键盘,而两个输出描述符,标准输出(stdout)和标准错误(stderr),都发送到屏幕。有时,将这些标准流重定向以便进程从文件中接收输入和/或将输出发送到文件会很方便。

stdin、stderr 和 stdout 的数值
stdin 0
stdout 1
stderr 2

在重定向或与这些流交互时,我们用它们的数值来引用它们。

标准输出重定向

例如,要将标准输出从屏幕重定向到文件,您将使用“>”符号。

例如

$ find / -iname *.txt > textfiles.txt

这将运行find 实用程序并将结果输出到 textfiles.txt 文件。屏幕上没有输出可见。如果 textfiles.txt 文件不存在,则会先创建它,否则会覆盖它。要追加到文件而不是创建新文件,可以使用“>>”运算符。


标准错误重定向

标准错误重定向使用与标准输入重定向相同的格式,但您需要指定要重定向的是 stderr 流而不是 stdout。这可以通过将 stderr 流 ID 放在重定向符号之前来完成。

$ myapp 2> error.txt

与上面的 stdout 示例一样,这将创建一个新文件。要追加到现有文件,您将使用“2>>”重定向标准错误。

重定向 stdout 和 stderr

要同时重定向 stdout 和 stderr,您将使用“&>”或“&>>”运算符。这将把标准输出和标准错误都定向到同一个文件。

标准输入重定向

要让进程从文件中读取输入而不是从键盘获取输入,您将使用“<' 符号,如下例所示

$ mysql -u root -p < createtable.sql

在这里,mysql 命令行界面被告知从名为 createtable.sql 的文件中获取其标准输入,而不是从键盘读取输入。此文件将包含用于创建表的 SQL 语句,例如。

管道命令

[编辑 | 编辑源代码]

管道命令用于将一个进程的标准输出重定向到另一个进程的标准输入。


program1 | program2

管道由“|”符号表示。数据流从左到右。下图说明了如何将一个进程的 stdout 重定向到另一个进程的 stdin。

# ls-l | less

tee 命令

command | tee FILENAME

此命令在管道之后使用,并以文件名作为参数。来自之前命令的标准输出将被发送到作为参数给定的文件,但tee 也允许流通过到stdoutstdout 已经通过这种方式被复制。

xargs

此工具通常被认为是find 的配套工具。事实上,xargs 会将标准输出的每一行作为另一个工具的参数 进行处理。我们可以使用xargs 来删除属于某个用户的所有文件,方法如下:

$ find / -type f -user 502 | xargs rm –f

如果文件名列表很长,xargs 将将其拆分为多个部分,并多次调用 rm 命令,每个部分一个。如果参数列表过长而无法处理,这有时很有用。

$ ls |xargs rm -f



使用过的文件、术语和实用程序

  • tee
  • xargs


上一章 | 下一章

华夏公益教科书