跳到主要内容

Linux 管道与重定向

Linux 命令行真正好用的地方,不只是每个命令本身,而是命令之间可以组合。管道和重定向就是组合命令的基础。

你可以把它们理解成:

  • 重定向:把输入或输出换一个地方。
  • 管道:把前一个命令的输出交给后一个命令继续处理。

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

一个命令通常有三条默认通道:

名称编号含义
标准输入 stdin0命令从哪里读数据
标准输出 stdout1正常结果输出到哪里
标准错误 stderr2错误信息输出到哪里

默认情况下,标准输入来自键盘,标准输出和标准错误都显示在终端。

输出重定向

把命令输出写入文件:

echo "hello linux" > hello.txt
cat hello.txt

> 会覆盖文件内容。如果文件不存在,会创建文件。

追加到文件末尾:

echo "second line" >> hello.txt
cat hello.txt

>> 不会覆盖旧内容,而是追加。

注意

使用 > 时要小心。如果目标文件已经存在,内容会被覆盖。

错误重定向

错误信息属于标准错误,可以用 2> 重定向:

ls /not-exist 2> error.log
cat error.log

如果你想忽略错误信息,可以重定向到 /dev/null

find /etc -name "*.conf" 2>/dev/null

/dev/null 是一个特殊设备,写进去的内容会被丢弃。

同时重定向标准输出和错误

把正常输出和错误都写入同一个文件:

command > output.log 2>&1

在 Bash 中也常写成:

command &> output.log

第一种写法更通用,第二种更简洁。

输入重定向

有些命令可以从标准输入读取内容。比如:

wc -l < hello.txt

这会统计 hello.txt 的行数。

输入重定向不如输出重定向常见,但理解它有助于你看懂脚本。

管道

管道符号是 |。它会把左边命令的标准输出,交给右边命令作为标准输入。

例如:

ls -la /etc | less

这会把 ls -la /etc 的输出交给 less 分页查看。

再看一个例子:

ps aux | grep ssh

这会先列出所有进程,再筛选包含 ssh 的行。

tee:一边显示一边保存

有时你既想在终端看到输出,又想保存到文件,可以使用 tee

ls -la | tee files.txt

追加写入:

ls -la | tee -a files.txt

tee 在调试脚本、保存日志时很实用。

常见组合

查看当前目录文件数量:

ls | wc -l

查找日志中的错误并保存:

grep -i error app.log | tee errors.txt

查看大目录并分页:

du -h /var 2>/dev/null | sort -h | tail

这个命令已经稍微复杂了。你可以拆开看:

  • du 统计目录大小。
  • 2>/dev/null 忽略权限错误。
  • sort -h 按人类可读大小排序。
  • tail 显示最后几行。

小结

管道和重定向是 Linux 命令行的核心能力:

  • > 覆盖写入文件。
  • >> 追加写入文件。
  • 2> 重定向错误信息。
  • | 把一个命令的输出交给下一个命令。
  • tee 可以同时显示和保存输出。

学会组合命令后,你就不只是“使用命令”,而是在搭建小型的数据处理流水线。