The Missing Semester of Your CS Education 练习
前言
- 英文官网:https://missing.csail.mit.edu/ ,中文翻译:https://missing-semester-cn.github.io/
- 我用的是 WSL2 (Ubuntu-20.04),下面的代码均在此环境上测试通过
- 文章中练习题采用中文翻译版本,部分练习只截取前面第一句作为标题
课程概览与 shell
5. 将以下内容一行一行地写入 semester 文件 …
将以下内容一行一行地写入 semester 文件,第一行可能有点棘手,# 在 Bash 中表示注释,而 ! 即使被双引号(")包裹也具有特殊的含义。 单引号(')则不一样,此处利用这一点解决输入问题。更多信息请参考 Bash quoting 手册。
#!/bin/sh
curl --head --silent https://missing.csail.mit.edu
✅ 解决方法
echo '#!/bin/sh' > /tmp/missing/semester
echo "curl --head --silent https://missing.csail.mit.edu" >> /tmp/missing/semester
包含 ! 则需要用单引号而不是双引号。
9. 使用 chmod 命令改变权限 …
使用 chmod 命令改变权限,使 ./semester 能够成功执行,不要使用 sh semester 来执行该程序。
✅ 解决方法
chmod 744 semester
744 对应 rwxr-xr-x 也就是先转换成二进制 111101101 再分成三个三位二进制数 111 101 101,最后转换成十进制也就是 744。
10. 使用 | 和 > …
使用 | 和 > ,将 semester 文件输出的最后更改日期信息,写入 /home 目录下的 last-modified.txt 的文件中
✅ 解决方法
ls -l semester | cut -d" " -f6,7,8 > ~/last-modified.txt
cut 命令把 -rwxr--r-- 1 focal focal 61 Mar 28 18:36 semester 按空格分割,选择第 6、7、8 段输出,也就是 Mar 28 18:36。
Shell 工具和脚本
3. 假设您有一个命令,它很少出错 …
假设您有一个命令,它很少出错。因此为了在出错时能够对其进行调试,需要花费大量的时间重现错误并捕获输出。 编写一段 bash 脚本,运行如下的脚本直到它出错,将它的标准输出和标准错误流记录到文件,并在最后输出所有内容。加分项:报告脚本在失败前共运行了多少次。
#!/usr/bin/env bash
n=$(( RANDOM % 100 ))
if [[ n -eq 42 ]]; then
echo "Something went wrong"
>&2 echo "The error was using magic numbers"
exit 1
fi
echo "Everything went according to plan"
✅ 解决方法
#!/bin/bash
# test.sh 就是上面的测试文件
# test-out.log 是正常输出
# test-err.log 是错误输出
./test.sh 1>> ./test-out.log 2>> ./test-err.log
count=1
while [[ $? -eq 0 ]]; do
let count++
./test.sh 1>> ./test-out.log 2>> ./test-err.log
done
echo "运行次数 $count"
1>> 代表标准输出流,2>> 代表错误输出流,$? 代表前一个命令的返回值,把变量 +1 需要在语句前加上 let。
4. 本节课我们讲解的 find 命令中的 -exec 参数非常强大 …
本节课我们讲解的 find 命令中的 -exec 参数非常强大,它可以对我们查找的文件进行操作。但是,如果我们要对所有文件进行操作呢?例如创建一个 zip 压缩文件?我们已经知道,命令行可以从参数或标准输入接受输入。在用管道连接命令时,我们将标准输出和标准输入连接起来,但是有些命令,例如 tar 则需要从参数接受输入。这里我们可以使用 xargs 命令,它可以使用标准输入中的内容作为参数。 例如 ls | xargs rm 会删除当前目录中的所有文件。
您的任务是编写一个命令,它可以递归地查找文件夹中所有的 HTML 文件,并将它们压缩成 zip 文件。注意,即使文件名中包含空格,您的命令也应该能够正确执行(提示:查看 xargs 的参数 -d)
✅ 解决方法(tar + xargs)
# 压缩
find . -name "*.html" | xargs -d "\n" tar -czf t.tar.gz
# 解压
mkdir ex
tar -xzf t.tar.gz -C ex
tar 命令的 -c 代表创建压缩包,-x 代表解压缩包,-z 代表用 GZip 处理,-f 后面跟要操作的文件名。
✅ 解决方法(zip)
# 压缩
find . -name "*.html" -print | zip t.zip -@
# 查看压缩包
unzip -l t.zip
# 输出
Archive: t.zip
Length Date Time Name
--------- ---------- ----- ----
7 2021-04-04 19:32 中文.html
4 2021-04-04 19:31 are you ok.html
6 2021-04-04 19:31 hi.html
4 2021-04-04 19:32 folder/num.html
--------- -------
21 4 files
5. 编写一个命令或脚本递归的查找文件夹中最近使用的文件 …
编写一个命令或脚本递归的查找文件夹中最近使用的文件。更通用的做法,你可以按照最近的使用时间列出文件吗?
✅ 解决方法
find . -type f | xargs ls -lt
find 命令查找所有文件,xargs 可以把前面的输出转换成参数传给后面的命令,ls -t 负责按最近修改时间显示。
编辑器 (Vim)
这节课的练习都是实践的形式,没有标准答案 🧐
数据整理
TODO
命令行环境
TODO
版本控制 (Git)
TODO
调试及性能分析
TODO
元编程
TODO
安全和密码学
TODO