重定向到文件

LinuxBeginner
立即练习

简介

默认情况下,Linux 命令会把所有内容输出到屏幕上。但如果你想保存这些数据,该怎么做?

这个过程称为重定向。你可以把它想象成在邮件上写一个「转寄地址」。

这也是理解 Shell 语法的一种好方法:重定向不会改变命令本身的基本功能,而是改变命令输入或输出的发送位置。

在本实验中,你将学习 3 种控制数据去向的方法:

  1. 重定向并覆盖(>):将输出保存到文件,并替换文件中原有的内容。
  2. 重定向并追加(>>):将输出添加到文件末尾。
  3. 错误重定向(2>):只捕获错误消息。

重定向输出(覆盖)

大于号 > 是覆盖运算符。

许多初学者把 > 理解为「保存到文件」,但更准确的理解是:「将标准输出发送到指定文件,并替换文件原有内容。」当你开始更谨慎地组合命令时,这个区别非常重要。

它告诉 Linux:「获取此命令的输入,并将其写入这个文件。如果文件已经存在,先清空文件。」

进入项目目录:

cd ~/project

将输出重定向到 output.txt:

echo "Hello, Linux." > output.txt

屏幕上不会显示任何内容,因为文本已经写入文件。使用下面的命令验证:

cat output.txt

现在,看看为什么我们称它为「覆盖」。运行以下命令:

echo "This is new content." > output.txt
cat output.txt

原来的 "Hello, Linux." 已经消失。> 运算符清空了文件,并写入了新内容。

因此,处理重定向时要像修改文件一样谨慎。一个简短的命令就可能立即替换已有文件的内容。

追加输出(>>)

很多时候,你并不想删除已有数据,而是想在原有内容后面添加数据。这时请使用两个大于号 >>。

它表示追加操作。

向 output.txt 添加一行:

echo "This line is appended." >> output.txt
cat output.txt

你应该会看到两行内容。

原有内容仍然保留。再执行一次:

echo "Another line." >> output.txt
cat output.txt

>> 运算符非常适合处理日志。

追加操作很重要,因为许多运维文件会随着时间不断增长,而不是每次都从头创建。日志、报告和命令记录通常都采用「添加到末尾」的工作方式。

重定向错误(2>)

正如你已经学到的,Linux 会将「正常输出」(stdout)与「错误输出」(stderr)分开处理。

> 和 >> 运算符只处理「正常输出」,不会处理错误消息。

这正是上一实验介绍的流模型发挥作用的地方。如果输出和错误属于不同的数据流,Linux 就可以将它们发送到不同的位置。

要捕获错误,请使用 2>。(标准错误的编号是 2。)

尝试列出一个不存在的目录:

ls /missing_directory 2> error.log

屏幕上仍然不会显示内容。错误消息已被捕获,并写入 error.log。

查看该文件:

cat error.log

你将看到被保存其中的错误消息。

2> 中的 2 来自标准错误使用的约定文件描述符编号。现在不必记住所有文件描述符,但你需要知道,这些编号表示 Shell 中不同的数据流通道。

总结

你已经掌握了控制数据流向的 3 种方法:

  • >(覆盖):将输出保存到文件,并清除原有内容。
  • >>(追加):将输出添加到文件末尾,并保留原有记录。
  • 2>(错误重定向):捕获错误消息。

借助这些工具,你可以高效地保存命令结果。