跳转至

The Missing Semester of Your CS Education 学习笔记

第一节 Shell

Shell 是什么

Shell(壳)是用户与操作系统之间的接口,它是一种命令行解释器,可以接收用户输入的命令并将其传递给操作系统执行。Shell 允许用户通过命令行来与操作系统交互,执行各种任务,如文件操作、程序运行、系统管理等。

Bash 常用语法

echo

用于向终端输出文本或变量的内容。

echo [选项] [字符]

常用选项:

  • -n:告诉echo命令输出文本后不自动换行(默认输出换行符)。
  • -e:启用 转义字符 的解析(默认不进行转义字符的处理)。

cd

用于改变当前工作目录。

cd [目录路径]

示例:

  • cd ..:切换上一级目录。
  • cd ~:切换到当前用户的家目录。
  • cd /home/user:切切换到 /home/user 目录。

pwd

显示当前所在的 工作目录 的完整路径。

pwd

ls

用于 列出目录内容,显示目录下的文件和子目录。

ls [选项] [目录]

示例:

  • ls:列出当前目录下的文件和文件夹。
  • ls -l:以长格式显示文件详情(包括权限、文件大小、修改时间等)。
  • ls -a:列出所有文件,包括隐藏文件(以 . 开头的文件)。

mv

用于 移动文件或目录,或者 重命名文件或目录。

mv [源路径] [目标路径]

示例:

  • mv file.txt /home/user/Documents/:将 file.txt 文件移动到指定目录。
  • mv oldname.txt newname.txt:将 oldname.txt 重命名为 newname.txt

cp

用于复制文件或目录。

cp [选项] [源路径] [目标路径]

示例:

  • cp file.txt /home/user/Documents/:复制 file.txt 文件到指定目录。
  • cp -r /source/dir /target/dir:递归地复制整个目录(用于复制目录及其内容)。

mkdir

用于创建新目录。

mkdir [选项] [目录名称]

示例:

  • mkdir newfolder:在当前目录下创建一个名为 newfolder 的新目录。
  • mkdir -p /home/user/newfolder/subfolder:递归创建目录,-p 选项会在父目录不存在时创建父目录。

cat

用于 查看文件内容,或者将多个文件的内容连接在一起。

cat [选项] [文件]

示例:

  • cat file.txt:显示 file.txt 的内容。
  • cat file1.txt file2.txt:将 file1.txtfile2.txt 的内容合并并输出。
  • cat > newfile.txt:将输入内容保存到 newfile.txt 文件(按 Ctrl+D 结束输入)。

sudo

使普通用户可以临时获得更高权限来执行一些需要管理员权限的操作,而不需要直接登录为超级用户(root)。

sudo [命令]

I/O 管理

重定向

  • 使用 > 或 >> 将命令的输出重定向到文件中。
  • >:会覆盖文件内容(如果文件已存在,文件内容会被清空并写入新内容)。
  • >>:会将输出内容追加到文件的末尾,不会覆盖文件内容。
  • 使用 < 将文件的内容作为命令的输入。

管道

是将一个命令的 标准输出 直接传递给另一个命令作为 标准输入,而不是通过文件进行中转。管道符号是 |

示例:

  • ls | sort:列出当前目录下的文件,并将输出通过管道传递给 sort 命令进行排序。

路径导航

Note

Linux 和 Windows 操作系统中,许多操作存在不同, 但是他们都使用 . 表示当前目录,.. 表示上一级目录

Linux 和 macOS:

  • 使用正斜杠 / 作为目录分隔符
    示例:/home/user/Documents/file.txt
  • 路径是以根目录 / 开始的绝对路径
    示例:/home/user/Documents/file.txt
  • 相对路径则从当前工作目录开始
    示例:./Documents/file.txt ../file.txt
  • /:根目录,所有文件和目录从根目录开始。
  • ~:表示当前用户的家目录。
    例如:/home/user
  • 路径区分大小写
    示例:/home/user/home/User 是不同的路径。
  • 路径中空格需要用反斜杠\转义
    示例:/home/user/My\ Documents/file.txt

Windows:

  • 使用反斜杠 \ 作为目录分隔符
  • 使用驱动器字母来标识不同的分区或磁盘
    示例:C:\Users\user\Documents\file.txt
  • 相对路径从当前驱动器开始
    示例:.\Documents\file.txt ..\file.txt
  • 反斜杠 \ 是一个转义字符,所以需要使用两个反斜杠 \\ 来表示路径
    示例:C:\\Users\\user\\Documents\\file.txt
  • C:\Users\ 用于存放用户的个人文件
  • %USERPROFILE% 表示当前用户的个人目录
  • 路径不区分大小写
    示例:C:\Users\userC:\Users\USER 是相同的路径
  • 如果路径中包含空格,通常需要将整个路径用双引号括起来
    示例:"C:\Program Files\MyApp\file.txt"

课后习题

第二节 Shell 工具和脚本

转义

单引号 '

定义方式:字符串被完全包裹在单引号中,所有字符都被视为字面量字符,不会进行任何特殊处理或转义。

  • 单引号内的内容被视为原样字符串,不会进行变量替换、命令替换、转义等操作。
  • 单引号内的字符(包括空格、特殊字符等)都会被当作普通字符处理。

双引号 "

定义方式:字符串被包裹在双引号中,可以包含变量、命令替换、转义字符等。

  • 双引号内的内容会进行 变量替换、命令替换 和 转义字符处理。
  • 可以在双引号内使用 $ 引用变量、反引号``$() 进行命令替换,且转义字符(如 \n, \t, \\)会被解析。

转义字符

可以使用反斜杠 \ 来转义某些特殊字符,使其作为字面量字符出现,而不执行特殊功能。例如,使用 \" 来转义双引号,使用 \$ 来转义美元符号等。

通配

  • 通配符:当你想要利用通配符进行匹配时,你可以分别使用 ? 和 * 来匹配一个或任意个字符。
  • 花括号 {}:当你有一系列的指令,其中包含一段公共子串时,可以用花括号来自动展开这些命令。这在批量移动或转换文件时非常方便。
convert image.{png,jpg}
# 会展开为
convert image.png image.jpg

cp /path/to/project/{foo,bar,baz}.sh /newpath
# 会展开为
cp /path/to/project/foo.sh /path/to/project/bar.sh /path/to/project/baz.sh /newpath

# 也可以结合通配使用
mv *{.py,.sh} folder
# 会移动所有 *.py 和 *.sh 文件

mkdir foo bar

# 下面命令会创建 foo/a, foo/b, ... foo/h, bar/a, bar/b, ... bar/h 这些文件
touch {foo,bar}/{a..h}
touch foo/x bar/y
# 比较文件夹 foo 和 bar 中包含文件的不同
diff <(ls foo) <(ls bar)
# 输出
# < x
# ---
# > y

查找文件

find 命令

find 是一个强大的文件搜索工具,它通常用来在文件系统中查找匹配特定条件的文件或目录。它是 Unix 和 Linux 系统中非常常见的命令之一。

基本语法

find [路径] [查找条件] [操作]
  • 路径:指定查找的起始目录(例如:/home/user)。如果不指定路径,find 默认会从当前目录开始查找。
  • 查找条件:指定要查找的条件(例如:文件名、大小、时间等)。
  • 操作:指定对查找到的文件或目录进行的操作(例如:-print, -exec 等)。

常见用法

  1. 查找文件名包含特定字符串的文件:
find /path/to/search -name "*.txt"
# 查找 /path/to/search 目录下所有扩展名为 .txt 的文件。
  1. 查找文件并执行操作:
find /path/to/search -name "*.log" -exec rm {} \;
# 查找所有 .log 文件,并删除它们。{} 是 find 命令找到的每一个文件的占位符。
  1. 查找并列出所有目录:
find /path/to/search -type d
# 查找并列出所有目录(-type d 仅匹配目录)。

fd命令

fd 是一个现代化的文件查找工具,旨在提供一个更快速、更简洁、更用户友好的替代品,通常作为 find 命令的替代。fdfind 更注重速度和简洁的用户体验,且它在使用上有很多简化。 基本语法

fd [查找条件] [路径]
  • 查找条件:指定要查找的文件名或正则表达式。
  • 路径:指定查找的起始目录,默认为当前目录。

常见用法

  1. 查找文件名包含特定字符串的文件:
fd "*.txt"
# 查找当前目录及子目录下所有 .txt 文件。
  1. 按文件扩展名查找:
fd -e txt
# 查找当前目录及子目录下所有 .txt 文件(-e 用于指定扩展名)。
  1. 显示文件的路径并过滤:
fd "error" --type f --exec cat {} \;
# 查找所有包含 "error" 的文件,并执行 cat 命令查看文件内容。