以下所有操作均在 WSL 的 PowerShell 环境中执行。
课程内容整理
1. date —— 获取系统时间
使用 date 命令可以获取当前系统的日期和时间信息。
memo@Troic16:/$ date
Tue Dec 2 09:40:47 CST 2025
2. echo —— 输出参数内容
echo 可用于打印字符串、变量值等信息。虽然像 "Hello World" 这样的简单字符串不加引号也能正常输出,但为了防止特殊字符或空格造成解析错误,建议始终使用引号包裹。
通过转义字符可确保空格被正确识别并参与输出处理。后续会进一步说明单引号与双引号之间的差异。
memo@Troic16:/$ echo hello
hello
memo@Troic16:/$ echo Hello World
Hello World
memo@Troic16:/$ echo "Hello World"
Hello World
memo@Troic16:/$ echo Hello\ World
Hello World
memo@Troic16:/$ echo 'Hello World'
Hello World
3. 搜索程序路径(环境变量 $PATH)
环境变量本质上也是变量,因此可以通过 echo $PATH 查看系统查找内置命令(如 echo、date)时所使用的目录路径。
命令 which echo 能返回 echo 程序的绝对路径。
memo@Troic16:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:/mnt/d/mingw64/bin:/mnt/c/Program Files (x86)/Windows Kits/10/Windows Performance Toolkit/:/mnt/c/Program Files/Git/cmd:/mnt/c/Program Files/TortoiseGit/bin:/mnt/c/Users/zzj06/.cargo/bin:/mnt/d/Scripts/:/mnt/d/:/mnt/c/Users/zzj06/AppData/Local/Programs/Python/Launcher/:/mnt/c/Users/zzj06/AppData/Local/Microsoft/WindowsApps:/mnt/d/Microsoft VS Code/bin:/mnt/c/msys64/ucrt64/bin:/snap/bin
memo@Troic16:~$ which echo
/usr/bin/echo
memo@Troic16:~$ /usr/bin/echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:/mnt/d/mingw64/bin:/mnt/c/Program Files (x86)/Windows Kits/10/Windows Performance Toolkit/:/mnt/c/Program Files/Git/cmd:/mnt/c/Program Files/TortoiseGit/bin:/mnt/c/Users/zzj06/.cargo/bin:/mnt/d/Scripts/:/mnt/d/:/mnt/c/Users/zzj06/AppData/Local/Programs/Python/Launcher/:/mnt/c/Users/zzj06/AppData/Local/Microsoft/WindowsApps:/mnt/d/Microsoft VS Code/bin:/mnt/c/msys64/ucrt64/bin:/snap/bin
例如,/usr/bin/echo 就是该命令的实际路径,其功能等同于直接调用 echo 并结合 $PATH 查找。
memo@Troic16:~$ /usr/bin/echo hello
hello
若使用相对路径,则必须保证当前工作目录准确无误,因为不同位置下的相对路径指向可能完全不同。
memo@Troic16:/$ ./usr/bin/echo hello
hello
memo@Troic16:/$ cd usr
memo@Troic16:/usr$ ./usr/bin/echo hello
-bash: ./usr/bin/echo: No such file or directory
4. Shell 中的目录导航
常用命令包括:
- cd:切换当前工作目录
- pwd:显示当前所在目录的完整路径
常见路径表示方式:
- 根目录:
/
- 主目录:
~
- 当前目录:
.
- 父级目录:
..
- 返回上一个工作目录:
-
使用 cd + 绝对路径 可直接跳转至目标位置;而 cd + 相对路径 则基于当前目录进行移动。
memo@Troic16:/usr$ cd ./bin
memo@Troic16:/usr/bin$ cd ..
memo@Troic16:/usr$ cd -
/usr/bin
memo@Troic16:/usr/bin$ cd ~
memo@Troic16:~$ pwd
/home/memo
memo@Troic16:~$ cd /home/memo/graph_projects
memo@Troic16:~/graph_projects$ cd ../../../usr/bin
memo@Troic16:/usr/bin$ ./echo hello
hello
memo@Troic16:/usr/bin$ pwd
/usr/bin
5. ls —— 显示文件与目录信息
执行 ls 命令可列出当前目录下的文件和子目录。
memo@Troic16:/$ ls
bin boot etc init lib.usr-is-merged lost+found mnt proc run sbin.usr-is-merged srv tmp var
bin.usr-is-merged dev home lib lib64 media opt root sbin snap sys usr
memo@Troic16:/$ ls -l
total 2740
lrwxrwxrwx 1 root root 7 Apr 22 2024 bin -> usr/bin
drwxr-xr-x 2 root root 4096 Feb 26 2024 bin.usr-is-merged
drwxr-xr-x 2 root root 4096 Apr 22 2024 boot
当输出内容较多时,仅展示部分内容即可。
添加参数 -l 可以查看更详细的文件属性信息,其中权限字段中的 rwx 分别代表读(read)、写(write)、执行(execute)权限。每组 rwx 对应三类用户身份:
- 文件所有者
- 所属用户组(users)
- 其他所有用户
若某位权限为 -,则表示对应用户不具备该项操作权限。从下图可以看出,只有文件所有者拥有修改文件夹内容的写权限(w),其他用户无法增删其中文件。
可通过 chmod 命令调整权限设置。
-
更多选项可通过 man ls 或 ls --help 查阅。
6. 数据流重定向与管道操作
主要符号包括:<、|、>,它们用于控制输入输出的数据流向。
cat 命令常用来显示文件内容。这些重定向符号的作用是为数据流指定方向,实现输入输出的传递。
memo@Troic16:~$ echo hello > hello.txt
memo@Troic16:~$ cat hello.txt
hello
memo@Troic16:~$ cat < hello.txt > hello2.txt
memo@Troic16:~$ cat hello2.txt
hello
memo@Troic16:~$ echo "world" >> hello2.txt
memo@Troic16:~$ cat hello2.txt
hello
world
注意:echo 'world' > hello2.txt 会覆盖原文件内容,而使用 >> 则是在文件末尾追加新内容。
管道符 | 的作用是将前一个命令的输出作为后一个命令的输入。
memo@Troic16:~$ cat hello2.txt | head -1 > hello1.txt
memo@Troic16:~$ cat hello1.txt
hello
memo@Troic16:~$ cat hello2.txt | tail -1 >> hello1.txt
memo@Troic16:~$ cat hello1.txt
hello
world
例如,cat 输出的 "hello\nworld" 被传给 head,提取第一行 "hello" 并保存到 hello1.txt;再通过 tail 提取最后一行 "world",并追加至同一文件中。
需要强调的是,重定向操作中,右侧程序并不知晓左侧发生了什么,它只接收到来自左侧的数据流。
这一点在使用 sudo 时尤为重要。比如尝试修改 /sys/class/backlight 下的文件时,由于权限不足会提示拒绝访问。有人可能会尝试如下写法:
sudo echo 1 > brightness
但这实际上是错误的。根据 > 的优先级划分,该语句等价于:(sudo echo 1) > brightness,即管理员权限仅作用于 echo 命令本身,而非整个重定向过程。
正确的理解是:重定向符号仅负责传输数据,不传递权限上下文。
因此,应采用如下方式,将权限赋予能处理输入输出的工具:
echo 3 | sudo tee brightness
使用 tee 接收输入并写入目标文件,配合 sudo 即可成功完成写入操作。
7. mkdir —— 创建目录
使用 mkdir + 目录名 可创建新的文件夹。
memo@Troic16:~$ mkdir missing
memo@Troic16:~$ ls
graph_projects hello.txt hello1.txt hello2.txt last-modified.txt missing my photos projects serverexample
如果目录名称包含空格,务必使用引号包裹,例如:mkdir "my photos"。否则系统会将其视为两个独立名称,从而创建出名为 "my" 和 "photos" 的两个文件夹。
课后习题说明
参考链接:Solution - 课程概览与 shell · The Missing Semester of Your CS Education
- 第5题运行时可能出现 “Permission denied” 错误,原因是当前用户缺乏编辑权限。可通过执行
chmod 777 文件名 开放全部权限来解决。
- 第9题可通过组合使用
head 与 tail 实现单行内容提取。
- 关于第10题,在 WSL 环境中部分用户反映相关电量文件夹为空。实际上,此前提到的
brightness 文件以及本题涉及的电源管理目录在某些配置下也可能为空,属正常现象。