终端、路径与文件系统
本章目录
本章学习目标
- 区分终端、Shell、程序和当前目录
- 正确引用含空格的绝对与相对路径
- 在独立目录练习文件操作与临时清理
从终端到程序
终端是显示输入输出的界面,Shell 是解析命令的程序,Bash 是一种 Shell。敲下 ls 后,Bash 解析词和参数,查找程序再启动它;并不是终端自己列目录。pwd、cd 等用于定位,其中 cd 必须改变当前 Shell 的目录,因而通常是内建命令。终端关闭、Shell 退出和后台进程结束并不是同一件事。
Ubuntu 路径以斜杠分隔,根目录是 /,家目录可用 ~ 表示,当前目录是点,上级是两点。Windows D 盘在 WSL 中通常映射到 /mnt/d。PowerShell 的 D:\路径不能直接当成 Bash 的同一种路径写法。进入课程目录后再执行 bash examples/shell/linux-files.sh,脚本由自身位置定位,不依赖调用者恰好站在课程根目录。
路径、引用与逐步演算
相对路径依赖当前目录:站在课程根目录,data/users.csv 指教学数据;站在 examples 下,同样字符串会指另一个位置。绝对路径有固定起点,脚本用 ROOT 保存课程根目录,再构造输出位置。变量引用写 "$ROOT",避免目录名中的空格被 Shell 拆成多个参数,也避免通配符字符被再次展开。
示例建立名为 sample files 的目录,写入 note.txt,再复制为 copy.txt 并重命名。每一步都引用路径,因而空格不影响参数边界。cp 是复制,mv 是移动或改名,不是创建第二份。mkdir -p 可以重复运行并创建缺失父目录,适合脚本输出;但它不会证明目标目录有权限或磁盘空间。
文件元信息与通配符
ls -l 显示权限、大小和时间等元信息,ls -a 包含以点开头的隐藏文件。隐藏并不等于加密,只是一种命名约定。通配符星号由 Shell 展开为路径列表,不由 cp 自动理解;普通星号默认不包含点文件。单引号中的星号是字面字符,不能一边引用全部表达式一边期望它匹配所有文件。
find 更适合按条件遍历目录,下一章会介绍。不要解析 ls 的人类显示来批量处理文件,因为文件名可能有空格甚至换行。wc -c 数字节,不是汉字个数;文本编码、换行形式和字符数要区分。Windows 编辑器保存脚本宜用 UTF-8 与 LF 换行,CRLF 可能造成 Bash 解释器或命令尾部出现额外回车。
可重复执行与清理
示例用 mktemp 在课程输出目录创建独立子目录,结束时 trap 清理。生成目录后检查它仍位于指定 WORK 下,才允许递归删除;该检查针对本脚本自建临时目录,不能照搬去删除未知用户目录。真实工作首次执行删除操作前,先列出目标并核对完整路径,不通过字符串拼接猜测文件名。
练习的成功标准不是看到文件出现一次,而是从不同当前目录执行仍成功、空格路径正确、结束后临时文件清理且返回零。脚本出错时保留的诊断应指出哪一步失败。用小范围练习建立这些习惯,后续处理 CSV、日志和远程文件时就不会把路径误解变成数据丢失。
执行环境与验证边界
本课程命令使用 GNU 工具和 Bash 语法。Windows PowerShell 中的变量、引号、重定向和程序解析与 Bash 并不相同;请在 WSL 的 Ubuntu 终端运行示例,不能把整段 Bash 直接粘贴进 PowerShell。Git Bash 可以运行部分命令,但进程、权限、用户和工具选项可能不同;在 Git Bash 上成功不能证明已经在 Ubuntu 上验证。安装 WSL 是读者的环境准备步骤,课程脚本不会替读者更改系统配置。
每个可运行示例从脚本自身位置确定课程根目录,并只在课程 outputs/linux 子目录或自己建立的临时目录操作。首次运行前先阅读脚本,辨认哪些语句读取、哪些写入、哪些清理。检查路径中有空格时是否仍能运行,检查失败后是否返回非零状态,检查重新运行是否得到同样的结果。对生产数据进行操作时不能照搬练习目录的删除命令,必须重新确认目标范围。
Linux 学习应关注输入、输出、错误输出和退出状态这四件事。标准输出用于数据,标准错误用于诊断,退出状态用于让上层脚本判断成功与否;三者不能互相替代。把手工执行过程写成小脚本后,再通过独立目录重复运行一次。遇到差异时记录操作系统、Bash 和工具版本,把环境限制和代码错误区分开,这比无条件写下“全部通过”更有用。
完整示例与实际输出
#!/usr/bin/env bash
set -euo pipefail
ROOT="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/../.." && pwd)"
WORK="$ROOT/outputs/linux/linux-files"
mkdir -p -- "$WORK"
TMP_DIR="$(mktemp -d "$WORK/tmp.XXXXXX")"
cleanup() { case "$TMP_DIR" in "$WORK"/tmp.*) rm -rf -- "$TMP_DIR";; *) return 1;; esac; }
trap cleanup EXIT
mkdir -p -- "$TMP_DIR/sample files"
printf '%s\n' 'hello data' > "$TMP_DIR/sample files/note.txt"
cp -- "$TMP_DIR/sample files/note.txt" "$TMP_DIR/sample files/copy.txt"
mv -- "$TMP_DIR/sample files/copy.txt" "$TMP_DIR/sample files/renamed.txt"
printf 'file contents: '
cat -- "$TMP_DIR/sample files/renamed.txt"
printf 'bytes: '
wc -c < "$TMP_DIR/sample files/note.txt"
test -f "$TMP_DIR/sample files/renamed.txt"
实际运行通过Git Bash/MSYS on Windows compatibility run; Ubuntu and remote behavior not verified.
file contents: hello data bytes: 11
五道自测:先回答,再核对
01 · 终端与 Bash 是同一个东西吗?
查看提示
界面与解析程序。
查看参考答案
不是,终端显示输入输出,Bash 解析命令并启动程序。
02 · 相对路径依据哪里?
查看提示
当前工作目录。
查看参考答案
当前目录,不是总依据脚本目录;脚本应显式定位根目录。
03 · 目录有空格为何引用变量?
查看提示
参数拆分。
查看参考答案
双引号防止变量值被空格拆成多个参数与通配符展开。
04 · 隐藏文件就是安全文件吗?
查看提示
点号约定。
查看参考答案
不是,只是显示约定,不提供加密和访问隔离。
05 · wc -c 是字符数吗?
查看提示
编码。
查看参考答案
不是,是字节数;UTF-8 汉字通常占多个字节。
两项动手任务
任务 1 · 在临时目录中创建有空格的文件并复制,确认内容一致。
提示
mktemp 与双引号。
完整参考解答与检查方式
tmp_dir=$(mktemp -d); printf '%s\n' 'alpha' > "$tmp_dir/my file.txt"; cp -- "$tmp_dir/my file.txt" "$tmp_dir/copy.txt"; cmp -- "$tmp_dir/my file.txt" "$tmp_dir/copy.txt"; rm -f -- "$tmp_dir/my file.txt" "$tmp_dir/copy.txt"; rmdir -- "$tmp_dir" cmp 返回零表示逐字节相同;这里仅清理新建文件。任务 2 · 从课程之外的目录执行本章脚本,说明为何输出路径不变。
提示
BASH_SOURCE 而非 pwd。
完整参考解答与检查方式
在 Bash 中执行 bash '/mnt/d/liuwei/求职/笔试/notes/data_skills_html/examples/shell/linux-files.sh'。脚本使用 dirname BASH_SOURCE 后上溯两级定位课程根目录,因此当前目录不影响 WORK。实际路径按本机挂载调整;不在 PowerShell 直接解释 Bash 代码。官方资料与掌握状态
完成两项任务后,按独立完成程度记录。状态会尽量保存在当前浏览器,可导出备份。
动手任务记录
掌握状态与复习
关掉资料独立完成后记 A;提示后完成记 B;需要重学记 C。
记录尽量保存在当前浏览器,建议定期导出备份。