Skip to content
On this page

Linux中的输入和输出

在Linux中,输入和输出是允许您与系统交互并处理数据的基本概念。了解Linux环境中输入和输出的工作方式对于在终端中有效工作至关重要。

标准输入、输出和错误

Linux 中有三个标准流:STDIN(标准输入)、STDOUT(标准输出)和 STDERR(标准错误)。这些流用于处理运行程序和命令时的输入、输出和错误消息。

  • STDIN 是标准输入流,用于从键盘或另一个程序读取数据。数字 0 表示 STDIN 流。
  • STDOUT 是标准输出流,用于显示程序或命令的输出。数字 1 表示 STDOUT 流。
  • STDERR 是标准错误流,用于显示错误消息和诊断信息。数字 2 表示 STDERR 流。

默认情况下,STDIN 连接到键盘,而 STDOUTSTDERR 连接到终端。这意味着当您在 shell 中运行命令时,输入来自键盘,输出和错误消息显示在终端上。

一个良好的实践是将错误消息与常规输出分开,以便您可以轻松识别和处理错误。但有些程序可能不遵循这种约定,错误消息可能与常规输出混合在一起。

输入重定向

在Linux中,输入重定向允许您控制输入来自何处。默认情况下,当您在shell中运行命令时,STDIN连接到键盘。

输入重定向允许您更改命令读取其输入的位置。您可以将输入重定向为来自文件而不是键盘。

要将输入重定向为来自文件,您可以使用小于符号(<)后跟文件名。例如,要从名为input.txt的文件中读取输入,您可以使用以下命令:

sh
command < input.txt

以下是实际场景中输入重定向的工作原理示例。假设您有一个名为data.txt的文件,其中包含一组名称,您想要使用wc命令计算文件中名称的数量。您可以将输入重定向为来自文件,而不是在终端中手动输入每个名称。通过执行命令wc -l < data.txtwc命令将读取data.txt的内容作为输入并计算行数,这代表文件中名称的数量。这样,您可以节省时间和精力,而不必手动输入名称。data.txt文件的内容可能如下所示:

John Doe
Jane Smith
Michael Johnson
Emily Brown
William Davis

在这种情况下,文件包含了一个包含5个名字的列表,每个名字占据一行。通过将输入重定向来自文件,wc 命令将计算文件中的行数并显示结果。

双小于号符号 (<<) 用于 here document,它允许您与命令进行交互式输入。例如:

sh
command << EOF
This is some input.
EOF

在这种情况下,输入在 <<EOF 标记之间进行交互式提供。当您需要向命令提供多行输入时,这可能很有用。

输出重定向

输出重定向允许您更改命令发送其输出的位置。您可以将输出重定向到文件而不是终端。

要将输出重定向到文件,您可以使用大于号符号(>)后跟文件名。例如,要将输出重定向到名为 output.txt 的文件,您可以使用以下命令:

sh
command > output.txt

注意:>1> 的简化形式,它将 STDOUT 重定向到文件。如果要将 STDERR 重定向到文件,可以使用 2>

如果要将输出附加到现有文件而不是覆盖它,可以使用双大于号符号(>>)而不是单大于号符号(>)。例如:

sh
command >> output.txt

和符号(&)指的是文件描述符。在输出重定向的上下文中,1 代表 STDOUT2 代表 STDERR。通过将文件描述符与重定向符号结合使用,您可以将 STDOUTSTDERR 都重定向到同一个文件。例如:

sh
command > output.txt 2>&1

让我们分解一下命令:

  • command 是您要运行的命令。
  • >(与 1> 相同)将 STDOUT 流重定向到文件 output.txt
  • 2>STDERR 流重定向到某个地方。
  • &1 指的是文件描述符 1,即 STDOUT

通过结合使用 2>&1,你可以将 STDERR 重定向到与 STDOUT 相同的位置,这种情况下是文件 output.txt

结合输入和输出重定向

您可以结合输入和输出重定向,同时从文件中读取内容并将内容写入文件。例如:

sh
command < input.txt > output.txt

通过使用输入和输出重定向,您可以控制输入来自何处以及输出去向何处,使您的 shell 命令更加灵活和强大。

使用管道连接命令

管道是 Linux 中的一个强大功能,允许您连接多个命令并创建复杂的命令序列。在终端中使用管道可以极大地提高您的生产力和效率。

管道由竖线符号 | 表示。它允许将一个命令的输出重定向为另一个命令的输入。这使您能够将多个命令链接在一起,并在它们之间流动的数据上执行操作。

例如,假设您有一个包含大量文本文件的目录,您想要为每个文件找出单词计数。您可以使用 ls 命令列出目录中的所有文件,然后将输出管道到 wc 命令以计算单词数。命令如下所示:

sh
ls | wc -w

在这个例子中,ls 命令列出目录中的所有文件,管道符号 | 将输出重定向到 wc 命令。然后 wc 命令计算输入中的单词数并显示结果。

管道可以与任何产生输出的命令一起使用。它们允许您创建强大的命令组合,并轻松执行复杂的任务。

另一个管道的常见用途是过滤和处理文本。例如,您可以使用 grep 命令在文件中搜索特定模式,然后将输出重定向到 sort 命令以对行进行排序。然后,结果输出可以重定向到一个新文件或显示在屏幕上。

这里是一个示例:

sh
grep 'error' log.txt | sort > errors.txt

在这个示例中,grep 命令在文件 log.txt 中搜索包含单词 error 的行,管道将输出重定向到 sort 命令。然后,sort 命令按字母顺序对行进行排序,> 符号将输出重定向到文件 errors.txt

使用管道连接命令允许您构建复杂的命令序列并自动化重复的任务。它使您能够在将输出传递给下一个命令之前对一个命令的输出执行操作,从而使您能够创建强大的数据管道。

结论

输入和输出是 Linux 中的基本概念,它们允许您与系统交互并处理数据。通过了解输入和输出重定向、管道和流的工作原理,您可以更有效地在终端中工作并高效地执行各种任务。