Linux 中的输入输出和错误重定向 [初学者指南]Linux 中的输入输出和错误重定向 [初学者指南]Linux 中的输入输出和错误重定向 [初学者指南]Linux 中的输入输出和错误重定向 [初学者指南]
  • 业务
  • 目标
  • 支持
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容

Linux 中的输入输出和错误重定向 [初学者指南]

发表 admin at 2025年2月28日
类别
  • 未分类
标签

重定向是Linux 中的一个基本概念。了解如何在 Linux 命令行中使用 stdin、stdout、stderr 和管道重定向。

如果您熟悉基本的 Linux 命令,您还应该了解输入输出重定向的概念。

您已经了解 Linux 命令的工作原理。它接受输入并为您提供输出。现场有几个玩家。让我告诉你关于他们的事。

标准输入、标准输出和标准错误

当您运行 Linux 命令时,有三个数据流在其中发挥作用:

  • 标准输入(stdin)是输入数据的来源。默认情况下,stdin 是从键盘输入的任何文本。其流 ID 为 0。

  • 标准输出(stdout)是命令的结果。默认情况下,它显示在屏幕上。其流ID为1。

  • 标准错误 (stderr) 是命令产生的错误消息(如果有)。默认情况下,stderr 也会显示在屏幕上。它的流ID是2。

这些流在所谓的缓冲存储器中包含纯文本数据。

把它想象成水流。您需要水源,例如水龙头。您将管道连接到它,然后可以将其存储在桶中(文件)或给植物浇水(打印)。如果需要,您还可以将其连接到另一个水龙头。基本上,你正在改变水的方向。

Linux 也有重定向的概念,您可以将 stdin、stdout 和 stderr 从其通常的目的地重定向到另一个文件或命令(甚至打印机等外围设备)。

让我展示重定向的工作原理以及如何使用它。

输出重定向

第一种也是最简单的重定向形式是输出重定向,也称为 stdout 重定向。

您已经知道,默认情况下,命令的输出显示在屏幕上。例如,我使用 ls 命令列出所有文件,这是我得到的输出:

abhishek@linux:~$ ls
appstxt  new.txt  static-ip.txt

通过输出重定向,您可以将输出重定向到文件。如果此输出文件不存在,shell 将创建它。

command > file

例如,让我将 ls 命令的输出保存到名为 output.txt 的文件中:

abhishek@linux:~$ ls > output.txt

输出文件是预先创建的

你认为这个输出文件的内容应该是什么?让我用cat命令给你展示一个惊喜:

abhishek@linux:~$ cat output.txt 
appstxt
new.txt
output.txt
static-ip.txt

您是否注意到其中包含了output.txt?我特意选择这个例子来向大家展示这一点。

stdout 重定向到的输出文件是在运行预期命令之前创建的。为什么?因为它需要准备好输出将发送到的输出目的地。

追加而不是破坏

一个经常被忽视的问题是,如果您重定向到一个已经存在的文件,shell 将首先删除(破坏)该文件。这意味着输出文件的现有内容将被删除并替换为命令的输出。

您可以使用 >> 重定向语法追加而不是覆盖它。

command >> file

提示:您可以使用以下命令禁止当前 shell 会话中的破坏:set -C

为什么要重定向标准输出?您可以存储输出以供将来参考并稍后进行分析。当命令输出太大并且占据整个屏幕时,它特别有用。这就像收集日志。

管道重定向

在了解 stdin 重定向之前,您应该了解管道重定向。这是更常见的,可能您会经常使用它。

通过管道重定向,您可以将一个命令的标准输出发送到另一个命令的标准输入。

command 1 | command 2

让我向您展示一个实际的例子。假设您想计算当前目录中可见文件的数量。您可以使用ls -1(它是数字一,而不是字母L)来显示当前目录中的文件:

abhishek@linux:~$ ls -1
appstxt
new.txt
output.txt
static-ip.txt

您可能已经知道 wc 命令用于计算文件中的行数。如果将这两个命令与管道结合起来,您将得到以下结果:

abhishek@linux:~$ ls -1 | wc -l
4

使用管道,两个命令共享相同的内存缓冲区。第一个命令的输出存储在缓冲区中,然后将同一缓冲区用作下一个命令的输入。

您将看到管道中最后一个命令的结果。这是显而易见的,因为早期命令的标准输出被馈送到下一个命令,而不是转到屏幕。

管道重定向或管道不限于仅连接两个命令。你可以连接更多的命令,只要一个命令的输出可以作为下一个命令的输入。

command_1 | command_2 | command_3 | command_4

请记住 stdout/stdin 是一块数据,而不是文件名

一些 Linux 新用户在使用重定向时会感到困惑。如果命令返回一堆文件名作为输出,则不能使用这些文件名作为参数。

例如,如果使用 find 命令查找所有以 .txt 结尾的文件,则不能通过管道传递将找到的文件移动到新目录,而不能直接像这样:

find . -type f -name "*.txt" | mv destination_directory

这就是为什么您经常会看到 find 命令与 exec 或 xargs 命令结合使用。这些特殊命令“将带有一堆文件名的文本转换为文件名”,可以作为参数传递。

find . -type f -name "*.txt" | xargs -t -I{} mv {} ../new_dir

输入重定向

您可以使用 stdin 重定向将文本文件的内容传递给命令,如下所示:

command < file

您不会看到 stdin 被大量使用。这是因为大多数 Linux 命令接受文件名作为参数,因此通常不需要 stdin 重定向。

以此为例:

head < filename.txt

上面的命令可能只是 head filename.txt (不带 <)。

这并不是说 stdin 重定向完全没有用。一些命令依赖于它。以 tr 命令为例。该命令可以做很多事情,但在下面的示例中,它将输入文本从小写转换为大写:

tr a-z A-Z < filename.txt

事实上,建议使用 stdin 而不是管道,特别是为了避免不必要地使用 cat 命令。

例如,很多人会在上面的例子中使用cat,然后在上面使用tr。坦白说,这里没有必要使用cat。

cat filename.txt | tr a-z A-Z

组合重定向

您可以根据需要组合 stdin、stdout 和管道重定向。

例如,下面的命令列出当前目录中的所有 .txt 文件,然后对这些 .txt 文件进行计数并将输出保存到新文件中。

ls *.txt | wc -l > count.txt

错误重定向

有时,当您运行某些命令或脚本时,您会看到它在屏幕上显示一条错误消息。

abhishek@linux:~$ ls -l ffffff > output.txt
ls: cannot access 'ffffff': No such file or directory

在本文开头,我提到有三个数据流,stderr 是默认显示在屏幕上的输出数据流之一。

您也可以重定向 stderr。由于它是输出数据流,因此您可以使用与 stdout 重定向相同的 > 或 >> 重定向符号。

但是,当 stdout 和 stderr 都是输出数据流时,如何区分它们呢?通过它们的流 ID(也称为文件描述符)。

stdin

0

stdout

1

stderr

2

-t,

-列表

-u,

-更新

-x,

–提取, –获取

-j,

–bzip2

-z,

–gzip、–gunzip、–ungzip

默认情况下,当您使用输出重定向符号>时,它实际上意味着1>。换句话说,你是说这里正在输出ID为1的数据流。

当您必须重定向 stderr 时,您可以使用它的 ID,例如 2> 或 2>>。这表示输出重定向是针对数据流 stderr (ID 2) 的。

Stderr 重定向示例

让我用一些例子向您展示。假设你只是想保存错误,你可以使用这样的东西:

abhishek@linux:~$ ls fffff 2> error.txt
abhishek@linux:~$ cat error.txt 
ls: cannot access 'fffff': No such file or directory

这很简单。让我们把它变得稍微复杂一些(并且有用):

abhishek@linux:~$ ls -l new.txt ffff > output.txt 2> error.txt 
abhishek@linux:~$ cat output.txt 
-rw-rw-r-- 1 abhishek abhishek 0 May  5 10:25 new.txt
abhishek@linux:~$ cat error.txt 
ls: cannot access 'ffff': No such file or directory

在上面的示例中,ls 命令尝试显示两个文件。对于一个文件,它会成功,而对于另一个文件,它会出错。所以我在这里所做的是将 stdout 重定向到 ouput.txt (使用 >),将 stderr 重定向到 error.txt (使用 2>)。

您还可以将 stdout 和 stderr 重定向到同一文件。有一些方法可以做到这一点。

在下面的示例中,我首先以附加模式将 stderr(带有 2>>)发送到合并的.txt 文件。然后,stdout(带有>>)以追加模式发送到同一文件。

abhishek@linux:~$ ls -l new.txt fff 2>> combined.txt >> combined.txt 
abhishek@linux:~$ cat combined.txt 
ls: cannot access 'fff': No such file or directory
-rw-rw-r-- 1 abhishek abhishek 0 May  5 10:25 new.txt

另一种方法(也是首选方法)是使用 2>&1 之类的方法。可以粗略地翻译为“将 stderr 重定向到与 stdout 相同的地址”。

让我们以前面的示例为例,这次使用 2>&1 将 stdout 和 stderr 重定向到同一个文件。

abhishek@linux:~$ ls -l new.txt fff > output.txt 2>&1
abhishek@linux:~$ cat output.txt 
ls: cannot access 'fff': No such file or directory
-rw-rw-r-- 1 abhishek abhishek 0 May  5 10:25 new.txt

请记住,您不能在附加模式下使用 2>>&1 。 2>&1 已经进入追加模式。

您也可以先使用 2> 然后使用 1>&2 将 stdout 重定向到与 stderr 相同的文件。基本上,它是“>&”将一个输出数据流重定向到另一个数据流。

概括

  • 共有三个数据流。一个输入 stdin (0) 和两个输出数据流 stdout (1) 和 stderr (2)。

  • 键盘是默认的标准输入设备,屏幕是默认的输出设备。

  • 输出重定向与 > 或 >>(用于附加模式)一起使用。

  • 输入重定向与 < 一起使用。

  • 可以使用 2> 或 2>> 重定向 stderr。

  • stderr 和 stdout 可以使用 2>&1 组合。

由于您正在学习重定向,因此您还应该了解 tee 命令。此命令使您能够同时显示到标准输出并保存到文件。

我希望您喜欢这份有关 Linux 重定向的详细指南。如果您仍然有疑问或者有改进本文的建议,请在评论部分告诉我。

©2015-2025 Norria support@alaica.com