Day 4:前后台控制与重定向管道
今日目标:控制进程前后台切换、理解输入输出流——把命令的输出送到文件、把错误和正常输出分开或合并 🎯
命令速览
| 命令/操作 |
用途 |
jobs |
查看当前 shell 的后台任务 |
fg / bg |
前台恢复 / 后台继续运行 |
Ctrl+Z |
挂起当前前台进程 |
> / >> |
标准输出重定向(覆盖/追加) |
2> |
标准错误重定向 |
2>&1 |
错误合并到标准输出 |
| |
管道:前一个命令的输出作为后一个命令的输入 |
<<EOF |
Here Document:内联多行输入 |
逐个击破
① 前后台切换 — jobs / fg / bg / Ctrl+Z
- 关键操作:
命令 & → 直接在后台启动
Ctrl+Z → 挂起正在运行的前台进程
jobs → 列出当前 shell 的后台任务
fg %1 → 把编号 1 的任务调到前台
bg %1 → 让编号 1 的任务在后台继续运行
- 🖥️ 上手练:
sleep 300(前台运行),然后按 Ctrl+Z——进程被挂起
jobs——看到 sleep 状态是 “Stopped”
bg %1——sleep 在后台继续运行
jobs——状态变为 “Running”
fg %1——拉回前台,等它跑完或 Ctrl+C 终止
sleep 120 &——直接在后台启动,jobs 验证
- ⚠️ 常见坑:后台进程的输出仍然会打印到终端,干扰你输入。加
> /dev/null 2>&1 静默
② 标准输出重定向 — > 和 >>
- 语法:
命令 > 文件(覆盖)/ 命令 >> 文件(追加)
- 🖥️ 上手练:
echo "hello" > /tmp/out.txt && cat /tmp/out.txt——覆盖写入
echo "world" > /tmp/out.txt && cat /tmp/out.txt——再次覆盖,只剩 “world”
echo "line1" > /tmp/out2.txt && echo "line2" >> /tmp/out2.txt && cat /tmp/out2.txt——追加模式保留两行
> /tmp/empty.txt——清空文件或创建空文件(> 前面放空就是清空)
- ⚠️ 常见坑:
> 覆盖文件是立即发生的(命令执行前就清空文件),如果命令中途失败,原文件内容已经被消除
③ 错误重定向 — 2> 和 2>&1
- 语法:
命令 2> 文件 → 错误输出写入文件
命令 > 文件 2>&1 → 标准输出+错误输出合并写入同一文件
命令 > /dev/null 2>&1 → 静默所有输出
- 🖥️ 上手练:
ls /etc/hosts > /tmp/ok.txt 2>/tmp/err.txt——成功时 ok.txt 有内容,err.txt 空
ls /nonexist > /tmp/ok.txt 2>/tmp/err.txt——失败时 ok.txt 空,err.txt 有报错
ls /etc/hosts /nonexist > /tmp/all.txt 2>&1——成功和失败信息都在同一个文件
ls /nonexist 2>&1 | head——把错误也送入管道(默认管道只传标准输出!)
sleep 300 > /dev/null 2>&1 &——静默后台运行
- ⚠️ 常见坑:
2>&1 必须放在 > 之后!ls 2>&1 > file 是错误的——错误输出不会写入文件
④ 管道 — |
- 语法:
命令1 | 命令2 | 命令3
- 🖥️ 上手练:
cat /etc/passwd | wc -l——统计行数
ls -l /etc | sort -k5 -rn | head -5——最大的 5 个文件
ps aux | grep nginx | grep -v grep | wc -l——nginx 进程数量
- ⚠️ 常见坑:管道只传递标准输出,错误输出默认仍打印到终端。需
命令 2>&1 | 下一个命令 把错误也传入管道
⑤ Here Document — <<EOF
- 语法:
1 2 3 4
| cat > 文件 <<EOF 多行内容 多行内容 EOF
|
- 🖥️ 上手练:
- 用 Here Document 创建
/tmp/readme.txt,内容 3 行任意文字
- 用 Here Document 追加内容到同一个文件(用
>>)
- ⚠️ 常见坑:
EOF 前后不能有空格(除非使用 <<-EOF 配合 tab 缩进)
<<EOF(分隔符无引号):内容中的 $变量 和 $(命令) 会被 shell 展开替换
<<'EOF' 或 <<"EOF"(分隔符加引号):所有内容原样输出,变量和命令不会被展开
💪 今日必刷(全部终端实操)
- 后台启动
sleep 300,用 jobs 确认,再用 fg 拉回前台,Ctrl+C 终止
- 执行
ls /etc/hosts /nonexist(既有成功也有失败),将正常输出和错误输出分别写入不同文件
- 再执行一次同样的命令,但把正常输出和错误输出合并写入同一个文件
- 将
ps aux 的输出按内存占用排序,只显示前 5 行(管道串联 sort + head)
- 用 Here Document 创建
/tmp/config.ini,内容为 3 行配置项
- 排错题:
ls /nonexist 2>&1 > /tmp/out.txt——终端仍然显示错误信息,为什么?修正这条命令
- 排错题:你在后台运行了一个长时间脚本
long-task.sh &,终端不断被脚本的输出刷屏。如何在不杀进程的情况下让它静默?(提示:进程已在后台运行)
📚 命令详解