跳到主要内容

终端、Shell 与命令

本节目标

区分终端、Shell、命令、参数、Shell 内建和进程;能够在 dev-lab 中记录观察,并正确看待成功、失败、stdout 与 stderr。

开始前状态

你已按上一节创建 dev-lab,并在终端进入它。下面所有文件只会写入其中的 notes/output/;不需要网络、管理员权限或真实 Shell 配置文件。

必要原理

终端是你输入和阅读文本的窗口;Shell 是在终端中读取命令、解释参数并启动程序的解释器。命令可以是 Shell 内建,例如 cd,也可以是磁盘上的可执行程序,例如 ps。进程是正在运行的程序实例。

一条命令结束后,$? 保存它的退出状态:0 表示成功,非 0 表示失败。标准输出 stdout 是命令的正常结果;标准错误 stderr 用于错误信息。失败仍是失败,即使你把 stderr 保存到了文件中。

课程主线使用 Bash 兼容语法。macOS 默认的 zsh 也能运行本节命令;其提示符、type 的文字和 ps 展示格式可能不同,不需要因此切换 Shell 或改写任何配置。

动手完成

运行位置: dev-lab 根目录。预期输出: 当前路径和 notesoutput 目录。失败处理:pwd 不是你的练习目录,先 cddev-lab,不要在真实项目中继续。

pwd
ls

运行位置: 同一个 dev-lab 根目录。预期输出: notes/shell-notes.md 记录 Bash 的位置、cd 的内建身份和当前 Shell 进程。失败处理:command -v bash 没有输出,记录这个结果,先不要安装工具或修改配置。

printf '# Shell 观察\n\n' > notes/shell-notes.md
printf '终端提供输入输出窗口;Shell 解释命令和参数。\n\n' >> notes/shell-notes.md
printf 'Bash 的命令位置:\n' >> notes/shell-notes.md
command -v bash >> notes/shell-notes.md
printf '\ncd 的类型:\n' >> notes/shell-notes.md
type cd >> notes/shell-notes.md
printf '\n当前 Shell 进程:\n' >> notes/shell-notes.md
ps -p "$$" -o pid=,ppid=,comm= >> notes/shell-notes.md
printf '\n' >> notes/shell-notes.md

运行位置: 同一个 dev-lab 根目录。预期输出: 成功命令的退出状态为 0,失败命令的退出状态为非 0,而且 stdout 与 stderr 分别写入不同文件。失败处理: ls 的失败是本练习刻意制造的;不要把 stderr 当成成功结果,也不要重试不存在的路径。

printf '这条 printf 成功。\n' >> notes/shell-notes.md
printf 'printf 的退出状态:%s\n' "$?" >> notes/shell-notes.md
ls does-not-exist > output/shell-stdout.txt 2> output/shell-stderr.txt
status=$?
printf '失败 ls 的退出状态:%s\n' "$status" >> notes/shell-notes.md
printf 'stdout 内容:\n' >> notes/shell-notes.md
cat output/shell-stdout.txt >> notes/shell-notes.md
printf 'stderr 内容:\n' >> notes/shell-notes.md
cat output/shell-stderr.txt >> notes/shell-notes.md

运行位置: 同一个 dev-lab 根目录。预期输出: 临时 stdout、stderr 和观察笔记仍在,供下一节统一、明确地清理。失败处理: 若文件名与示例不同,先用 ls output 核对;不要使用通配符或递归删除。

ls notes output

观察结果

type cd 通常说明 cd 是 Shell 内建,command -v bash 给出 Bash 可执行文件的位置,ps -p "$$" 让你看到当前 Shell 的进程。笔记中成功状态为 0,失败的 ls 为非 0;空的 stdout 文件与包含错误说明的 stderr 文件正是两条流分开的证据。

常见问题

为什么 ps 显示 zsh 而不是 Bash? macOS 的交互 Shell 常是 zsh。这不改变课程的 Bash 兼容语法主线;记录结果即可。

失败命令已经把 stderr 写入文件,算成功吗? 不算。退出状态仍是非 0,stderr 只是被保存下来以便阅读。

完成检查

  • notes/shell-notes.md 包含命令位置、内建和进程的观察;
  • 能说出命令与参数的关系,以及 stdout 和 stderr 的不同用途;
  • 临时的 output/shell-stdout.txtoutput/shell-stderr.txt 与观察笔记会保留到下一节统一清理;
  • dev-lab 的原有 starter 文件仍未改动;下一节会恢复精确 starter 状态并运行 starter checker。

下一步

继续学习绝对路径与相对路径,并在同一个 dev-lab 内创建、复制、移动和明确清理练习文件。