终端、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 根目录。预期输出: 当前路径和 notes、output 目录。失败处理: 若 pwd 不是你的练习目录,先 cd 回 dev-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.txt、output/shell-stderr.txt与观察笔记会保留到下一节统一清理; dev-lab的原有 starter 文件仍未改动;下一节会恢复精确 starter 状态并运行 starter checker。
下一步
继续学习绝对路径与相对路径,并在同一个 dev-lab 内创建、复制、移动和明确清理练习文件。