跳转到内容

终端、路径与文件系统

计算机基础 · Linux
本章目录

本章学习目标

  • 区分终端、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。

记录尽量保存在当前浏览器,建议定期导出备份。