简介
在 Linux 中,重定向是一项强大的功能,它允许你控制命令的输入和输出去向。你可能在之前的实验中见过 > 或 >> 等操作符,它们被用于将输出重定向到文件中。本实验将为你介绍重定向的概念,并通过各种实用示例进行引导,非常适合没有 Linux 基础的初学者。
在 Linux 中,重定向是一项强大的功能,它允许你控制命令的输入和输出去向。你可能在之前的实验中见过 > 或 >> 等操作符,它们被用于将输出重定向到文件中。本实验将为你介绍重定向的概念,并通过各种实用示例进行引导,非常适合没有 Linux 基础的初学者。
让我们从输出重定向的基础开始:
打开终端。你应该位于 /home/labex/project 目录下。如果不确定,可以输入 pwd(打印工作目录)来检查当前位置。
我们将创建一个名为 redirect 的新文件并写入一些内容。输入以下命令:
echo 'hello labex' > redirect
该命令执行了两个操作:
echo 'hello labex' 打印文本 "hello labex"> 符号将此输出重定向到一个名为 redirect 的文件中如果文件不存在,它会被创建;如果文件已存在,其内容将被覆盖。
现在,让我们向同一个文件添加更多内容:
echo 'labex.io' >> redirect
>> 操作符与 > 类似,但它不会覆盖文件,而是将新内容追加到现有文件的末尾。
要查看我们刚刚创建和修改的文件内容,请使用 cat 命令:
cat redirect
你应该能看到我们添加到文件中的两行内容:第一行是 "hello labex",第二行是 "labex.io"。
在深入研究重定向之前,让我们先理解三个重要概念:
在 Linux 中,这些由文件描述符表示,它们只是代表打开文件的数字:
| 文件描述符 | 设备文件 | 描述 |
|---|---|---|
0 |
/dev/stdin |
标准输入 (stdin) |
1 |
/dev/stdout |
标准输出 (stdout) |
2 |
/dev/stderr |
标准错误 (stderr) |
让我们看看如何使用这些描述符的示例:
首先,创建一个名为 Documents 的新目录:
mkdir Documents
该命令会创建一个新目录。如果收到目录已存在的错误提示,没关系,这意味着你可以直接使用现有的目录。
现在,在该目录下创建一个 C 语言文件:
cat > Documents/test.c << EOF
#include <stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
EOF
该命令执行了以下操作:
cat > 开始向文件写入的过程Documents/test.c 是我们要写入的文件<< EOF 告诉 shell 继续接收输入,直到看到 "EOF"(文件结束符)EOF 标记了输入的结束现在,查看该文件的内容:
cat Documents/test.c
你应该能看到我们刚刚创建的 C 代码。
现在,让我们探索如何重定向标准错误:
尝试读取两个文件,一个存在,另一个不存在:
cat Documents/test.c nonexistent.c
你将看到 test.c(存在)的内容,以及针对 nonexistent.c(不存在)的错误消息。test.c 的内容被发送到 stdout,而错误消息被发送到 stderr。
现在,让我们将标准输出重定向到一个文件,并将标准错误重定向到另一个文件:
cat Documents/test.c nonexistent.c > output.log 2> error.log
该命令执行了以下操作:
cat Documents/test.c nonexistent.c 尝试显示两个文件的内容> output.log 将 stdout(文件描述符 1)重定向到名为 output.log 的文件2> error.log 将 stderr(文件描述符 2)重定向到名为 error.log 的文件查看这两个文件的内容:
echo "Output log:"
cat output.log
echo "Error log:"
cat error.log
你应该能在 output.log 中看到 test.c 的内容,并在 error.log 中看到关于 nonexistent.c 的错误消息。
有时,你可能希望将标准输出和标准错误重定向到同一个文件。当你想要捕获命令的所有输出(无论是正常输出还是错误消息)时,这非常有用。
让我们尝试在一条命令中列出当前目录和一个不存在目录的内容:
ls -l . nonexistent_directory > combined_output.log 2>&1
该命令执行了以下操作:
ls -l . 列出当前目录的内容nonexistent_directory 是尝试列出一个不存在的目录> combined_output.log 将 stdout 重定向到名为 combined_output.log 的文件2>&1 将 stderr 重定向到与 stdout 相同的地方(在本例中即 combined_output.log)现在,检查合并输出文件的内容:
cat combined_output.log
你应该能在此文件中同时看到目录列表和关于不存在目录的错误消息。
在 bash 中,有一种简写方式可以将 stdout 和 stderr 同时重定向到同一个文件:
ls -l . nonexistent_directory &> another_combined_output.log
&> 操作符等同于 > file 2>&1。
检查这个新文件的内容:
cat another_combined_output.log
你应该能看到与上一个文件相同的输出。
/dev/null 设备通常被称为“位桶”(bit bucket)或“黑洞”,是一个特殊的设备文件,它会丢弃所有写入其中的数据。它在 shell 脚本和命令行操作中有多种实用用途。
抑制命令输出:
我们已经了解了如何抑制标准输出:
ls -l > /dev/null
以及如何同时抑制标准输出和标准错误:
ls -l nonexistent_directory > /dev/null 2>&1
仅抑制错误消息:
有时你只想查看输出,而不希望看到错误消息:
ls -l . nonexistent_directory 2> /dev/null
你应该能看到目录列表,但不会看到关于不存在目录的错误提示。
将 /dev/null 用作空文件:
/dev/null 可以用作空文件输入。这对于那些需要输入文件但你不想提供任何实际输入的命令非常有用。例如:
grep "pattern" /dev/null
该命令不会产生任何输出,因为 /dev/null 是一个空文件。
测试文件是否存在:
你可以使用 /dev/null 来测试文件是否存在,而无需产生任何输出:
if cp Documents/test.c /dev/null 2> /dev/null; then
echo "File exists and is readable"
else
echo "File does not exist or is not readable"
fi
该脚本尝试将 test.c 复制到 /dev/null。如果成功,说明文件存在且可读。
清空文件内容:
你可以使用 /dev/null 快速清空文件内容:
cat /dev/null > combined_output.log
检查文件是否已清空:
cat combined_output.log
你应该看不到任何输出,这表明文件现在是空的。
在本实验中,你学习了 Linux 中的数据流重定向。你练习了:
> 和 >> 进行基础输出重定向。2> 重定向标准错误。/dev/null 来丢弃输出。这些重定向技术是 Linux 中强大的工具,允许你控制命令输出的去向。它们对于脚本编写、日志记录和有效管理命令输出至关重要。随着你继续使用 Linux,你会发现许多场景下这些技术都能派上用场。