一、标准输入输出(Standard I/O)与文件描述符

每个 Linux 进程启动时默认关联三个标准流(Standard Streams):

流名称

文件描述符

默认来源/目标

说明

STDIN(标准输入)

0

键盘

程序读取输入的地方

STDOUT(标准输出)

1

终端

正常输出内容

STDERR(标准错误)

2

终端

错误信息输出

关键点:这些流可通过重定向机制改变其输入或输出目标。


二、输出重定向

1. 常用重定向符号

符号

作用

示例

>

覆盖写入标准输出到文件

ls > file.list

>>

追加写入标准输出到文件

echo "data" >> log.txt

2>

覆盖写入标准错误到文件

find / -name invalid 2> error.log

2>>

追加写入标准错误到文件

command 2>> error.log

&>

覆盖写入所有输出(stdout + stderr)到文件

command &> all.log

&>>

追加写入所有输出到文件

command &>> all.log

说明

  • &>&>> 是 Bash 扩展语法。
  • 其等价 POSIX 写法为:> file 2>&1>> file 2>&1
  • 在可移植脚本中,建议使用 POSIX 兼容语法。

2. & 的多重含义

上下文

含义

示例

命令末尾

后台运行进程

ping 8.8.8.8 &

重定向中

引用文件描述符

2>&11>&2

重定向简写(Bash)

表示“所有输出”

&> file

条件语句

逻辑与操作符

cmd1 && cmd2


3. 重定向顺序的重要性

Shell 从左到右解析重定向命令。

正确写法

command > output.log 2>&1

执行过程:

  1. > output.log:将 stdout(fd=1)指向 output.log
  2. 2>&1:将 stderr(fd=2)指向 fd=1 当前的位置(即 output.log)。

错误写法

command 2>&1 > output.log

执行过程:

  1. 2>&1:此时 fd=1 仍指向终端,因此 fd=2 也指向终端。
  2. > output.log:仅将 fd=1 指向文件,fd=2 仍指向终端。

结果

  • 正常输出 → 写入 output.log
  • 错误信息 → 仍显示在终端

4. 合并标准错误与标准输出的方式对比

方法

说明

兼容性

2>&1

分步重定向(先重定向 stdout,再将 stderr 指向 stdout)

POSIX 标准

&>

一步合并(Bash 扩展)

Bash 特有,非 POSIX

内部等价&> file> file 2>&1


5. 实用技巧

(1) 合并错误与正常输出用于管道
find /etc -name passwd 2>&1 | wc -l

→ 将错误和正常输出统一送入管道,统计总行数。

(2) 静默执行(丢弃所有输出)
ping -c 2 192.168.1.1 &> /dev/null
  • /dev/null 是系统提供的“黑洞”设备,所有写入内容被丢弃。
  • 常用于脚本中避免干扰日志或终端。

三、管道(Pipe)

1. 基础用法:|

  • 将前一个命令的 标准输出 作为后一个命令的 标准输入
  • 不传递标准错误,需显式合并:2>&1

示例

cat /etc/passwd | grep root
ps aux | sort -k 3 -r | head -n 5

2. 管道与重定向组合

(1) 捕获错误信息
find / -name "*.log" 2>&1 | grep "No such file"
(2) 统计全部输出行数(含错误)
command 2>&1 | wc -l

四、输入重定向

1. <:从文件读取输入

将文件内容作为命令的标准输入。

示例

cat < /etc/hosts
tr 'a-z' 'A-Z' < /etc/issue
mail user@example.com < email_content.txt

适用场景:当命令不支持直接传文件名参数,只能从 stdin 读取时(如 tr)。


2. <<:Here Document(内嵌文档)

允许在命令中直接嵌入多行文本,直到遇到指定终止符(如 EOF)。

示例

cat > config.txt << EOF
line 1
line 2
line 3
EOF

要求

  • 终止符必须单独成行且前后一致。
  • 常用于脚本中生成配置文件、远程命令块等。

3. <<< 对比

符号

输入来源

典型用途

<

已存在的文件

使用文件内容作为命令输入

<<

命令后内嵌的多行文本

动态生成配置、脚本块或指令序列

简言之

  • < 是“读文件”
  • << 是“写文本块”

4. cat 与重定向的原理

cat(concatenate)的核心功能是:

从标准输入(stdin)读取数据,并将其输出到标准输出(stdout)。

  • 若指定文件:cat file.txt → 从文件读取并输出到终端。
  • 若无参数:cat → 从键盘读取(stdin),原样输出到终端,直到收到 EOF(Ctrl+D)。
cat > file 的工作机制
cat > myfile.txt

Shell 执行步骤:

  1. 启动 cat 命令;
  2. cat 的 stdout 重定向到 myfile.txt(覆盖写入);
  3. cat 从 stdin(默认为键盘)读取用户输入,按 Ctrl + D(EOF 信号);
  4. 用户输入内容经 cat 输出至 stdout,最终写入文件。

此方式可用于交互式创建文件。

cat > file << EOF 的工作机制
cat > config.txt << EOF
server_port=8080
log_level=info
EOF

Shell 执行步骤:

  • > config.txt:准备将 stdout 写入文件(覆盖模式);
  • << EOF:构造一段虚拟输入流(stdin);
  • cat 从 stdin 读取内嵌文本;
  • 输出到 stdout,即 config.txt

关键理解

  • cat 本身只是“搬运工”——它把 stdin 的内容搬到 stdout。
  • stdin 来源和 stdout 目标由 Shell 的重定向机制决定,而非 cat 自身控制。

五、实战应用场景

1. 日志分析

提取 Apache 访问日志中的 404 请求并统计:

grep "404" /var/log/httpd/access_log | awk '{print $7}' | sort | uniq -c | sort -nr > 404_errors.txt

2. 端口检测(静默模式)

nc -z -w 2 192.168.1.1 80 &> /dev/null
if [ $? -eq 0 ]; then
  echo "Port 80 is open"
else
  echo "Port 80 is closed"
fi

3. 批量文件处理

压缩所有 .txt 文件并分别记录成功与失败日志:

find . -name "*.txt" | while read -r file; do
  gzip "$file" 2>> compress_error.log
  echo "Compressed $file" >> compress_success.log
done

六、核心原理与注意事项

1. 重定向本质

  • 文件描述符的重映射
  • 例如 2>&1 表示:将 fd=2 指向 fd=1 当前所指向的目标(不是复制内容)。

2. 管道限制

  • 默认仅传递 STDOUT。
  • 处理大文件时,建议分块处理(如使用 splitawk 'NR<=N'),避免内存缓冲区溢出。

3. 安全建议

  • > 会覆盖文件内容,建议先检查文件是否存在或使用 >>
  • 在启用 set -e 的脚本中,确保重定向产生的错误能通过 $? 正确捕获。

七、Vim 编辑器常用操作

1. 命令模式(Normal Mode)

命令

功能

:set nu

显示行号

:set nonu

取消行号

G

跳至文件末尾

gg

跳至第一行

:30

30G

跳至第 30 行

$

跳至行尾

dd

删除当前行

2dd

删除从当前行起共 2 行

yy

/ 2yy

复制 1 行 / 2 行

p

粘贴(光标后)

u

撤销上一步操作

cc

删除当前行并进入插入模式

:%s/old/new/g

全文替换

:%d

ggdG

删除全部内容

:set ignorecase

搜索忽略大小写

:set noignorecase

搜索区分大小写

:set paste

启用粘贴模式(防止自动缩进干扰)


2. 插入模式(Insert Mode)

按键

功能

i

在光标当前位置进入插入模式

o

在当前行下方插入新行并进入插入模式

O

在当前行上方插入新行并进入插入模式


3. 可视化模式(Visual Mode)

按键

功能

v

字符级选择

V

行级选择

Ctrl+v

块选择(列模式)


4. 交换文件(Swap File)处理

当 Vim 检测到 .filename.swp 文件时,可能原因包括:

  • 其他 Vim 实例正在编辑该文件;
  • 上次编辑异常退出,留下恢复文件。

操作选项

  • (O)pen Read-Only:只读打开;
  • (E)dit anyway:强制编辑(有冲突风险);
  • (R)ecover:尝试从交换文件恢复内容;
  • (D)elete it:删除交换文件;
  • (Q)uit:退出;
  • (A)bort:放弃打开。

建议:若确认无需恢复,应手动删除 .swp 文件以避免重复提示。


八、核心符号速查表

符号

作用

>

标准输出覆盖重定向

>>

标准输出追加重定向

2>

标准错误覆盖重定向

2>>

标准错误追加重定向

&>

所有输出覆盖重定向(Bash 扩展)

&>>

所有输出追加重定向(Bash 扩展)

2>&1

将标准错误重定向到标准输出

<

从文件读取输入

<<

Here Document(多行内嵌输入)

总结

掌握 IO 重定向、管道、输入重定向以及 Vim 基础操作,是构建高效 Linux 自动化脚本、日志分析流程和系统管理任务的核心能力。


 

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐