Day 4:前后台控制与重定向管道

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 的任务在后台继续运行
  • 🖥️ 上手练
    1. sleep 300(前台运行),然后按 Ctrl+Z——进程被挂起
    2. jobs——看到 sleep 状态是 “Stopped”
    3. bg %1——sleep 在后台继续运行
    4. jobs——状态变为 “Running”
    5. fg %1——拉回前台,等它跑完或 Ctrl+C 终止
    6. sleep 120 &——直接在后台启动,jobs 验证
  • ⚠️ 常见坑:后台进程的输出仍然会打印到终端,干扰你输入。加 > /dev/null 2>&1 静默

② 标准输出重定向 — > 和 >>

  • 语法命令 > 文件(覆盖)/ 命令 >> 文件(追加)
  • 🖥️ 上手练
    1. echo "hello" > /tmp/out.txt && cat /tmp/out.txt——覆盖写入
    2. echo "world" > /tmp/out.txt && cat /tmp/out.txt——再次覆盖,只剩 “world”
    3. echo "line1" > /tmp/out2.txt && echo "line2" >> /tmp/out2.txt && cat /tmp/out2.txt——追加模式保留两行
    4. > /tmp/empty.txt——清空文件或创建空文件(> 前面放空就是清空)
  • ⚠️ 常见坑> 覆盖文件是立即发生的(命令执行前就清空文件),如果命令中途失败,原文件内容已经被消除

③ 错误重定向 — 2> 和 2>&1

  • 语法
    • 命令 2> 文件 → 错误输出写入文件
    • 命令 > 文件 2>&1 → 标准输出+错误输出合并写入同一文件
    • 命令 > /dev/null 2>&1 → 静默所有输出
  • 🖥️ 上手练
    1. ls /etc/hosts > /tmp/ok.txt 2>/tmp/err.txt——成功时 ok.txt 有内容,err.txt 空
    2. ls /nonexist > /tmp/ok.txt 2>/tmp/err.txt——失败时 ok.txt 空,err.txt 有报错
    3. ls /etc/hosts /nonexist > /tmp/all.txt 2>&1——成功和失败信息都在同一个文件
    4. ls /nonexist 2>&1 | head——把错误也送入管道(默认管道只传标准输出!)
    5. sleep 300 > /dev/null 2>&1 &——静默后台运行
  • ⚠️ 常见坑2>&1 必须放在 > 之后!ls 2>&1 > file 是错误的——错误输出不会写入文件

④ 管道 — |

  • 语法命令1 | 命令2 | 命令3
  • 🖥️ 上手练
    1. cat /etc/passwd | wc -l——统计行数
    2. ls -l /etc | sort -k5 -rn | head -5——最大的 5 个文件
    3. ps aux | grep nginx | grep -v grep | wc -l——nginx 进程数量
  • ⚠️ 常见坑:管道只传递标准输出,错误输出默认仍打印到终端。需 命令 2>&1 | 下一个命令 把错误也传入管道

⑤ Here Document — <<EOF

  • 语法
    1
    2
    3
    4
    cat > 文件 <<EOF
    多行内容
    多行内容
    EOF
  • 🖥️ 上手练
    1. 用 Here Document 创建 /tmp/readme.txt,内容 3 行任意文字
    2. 用 Here Document 追加内容到同一个文件(用 >>
  • ⚠️ 常见坑
    • EOF 前后不能有空格(除非使用 <<-EOF 配合 tab 缩进)
    • <<EOF(分隔符无引号):内容中的 $变量$(命令) 会被 shell 展开替换
    • <<'EOF'<<"EOF"(分隔符加引号):所有内容原样输出,变量和命令不会被展开

💪 今日必刷(全部终端实操)

  1. 后台启动 sleep 300,用 jobs 确认,再用 fg 拉回前台,Ctrl+C 终止
  2. 执行 ls /etc/hosts /nonexist(既有成功也有失败),将正常输出和错误输出分别写入不同文件
  3. 再执行一次同样的命令,但把正常输出和错误输出合并写入同一个文件
  4. ps aux 的输出按内存占用排序,只显示前 5 行(管道串联 sort + head
  5. 用 Here Document 创建 /tmp/config.ini,内容为 3 行配置项
  6. 排错题ls /nonexist 2>&1 > /tmp/out.txt——终端仍然显示错误信息,为什么?修正这条命令
  7. 排错题:你在后台运行了一个长时间脚本 long-task.sh &,终端不断被脚本的输出刷屏。如何在不杀进程的情况下让它静默?(提示:进程已在后台运行)

📚 命令详解

命令 详细参考
jobs bg-fg-jobs
fg bg-fg-jobs
bg bg-fg-jobs