The Missing Semester-Chap1

1. shell命令的实质

当你在 shell 中执行命令时,本质是在执行一段 shell 可以解释执行的简短代码。

1
2
3
# 打印当前的日期和时间
date
# 2023年 12月 12日 星期二 08:30:09 CST

可以向程序传递参数。
1
2
3
# 把hello传给echo,打印到终端
echo hello
# hello

如果你要求 shell 执行某个指令,但是该指令并不是 shell 所了解的编程关键字,
那么它会在 环境变量 $PATH 中查找该指令对应的程序。
1
2
3
4
5
6
7
8
9
10
echo $PATH
# /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/cpy/.local/bin:/home/cpy/bin

# 查找echo位置
which echo
# /usr/bin/echo

# 与echo $PATH等价
/bin/echo $PATH
# /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/cpy/.local/bin:/home/cpy/bin

2. shell 中的路径

shell 中的路径是一组被分割的目录,在 Linux 和 macOS 上使用 / 分割,
而在Windows上是 \。路径 / 代表的是系统的根目录,所有的文件夹都包括在这个路径之下。

如果某个路径以 / 开头,那么它是一个绝对路径,其他的都是相对路径。

相对路径是指相对于当前工作目录的路径,当前工作目录可以使用 pwd 命令来获取。

此外,切换目录需要使用 cd 命令。在路径中,. 表示的是当前目录,而 .. 表示上级目录:

1
2
3
4
5
6
7
8
9
10
11
pwd
# /home/cpy

cd /home
cd ..
pwd
# /

cd ./home
/../bin/echo hello
# hello

3. 一些常用的命令及常用用法

3.1 cd

cd:改变当前工作目录到指定路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 切换到home
cd /home

# 切换到当且目录下的cpy子目录
cd ./cpy

# 切换到父目录
cd ..

# 切切换至用户家目录
cd ~

# 切换到上一次的工作目录
cd -
pwd
# /

3.2 ls

ls:显示指定工作目录下之内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
cd ~
# 打印当前目录下的内容
ls
# code missing_semi 模板 图片 下载 桌面
# last-modified.txt 公共 视频 文档 音乐

# 显示指定工作目录下之内容
ls /
# bin dev home lib64 mnt proc run srv tmp var
# boot etc lib media opt root sbin sys usr 文档

# 列出所有文件信息,包括权限,所有者,大小和修改日期:
ls -l
# 总用量 4
# drwxr-xr-x. 4 cpy cpy 36 11月 12 23:45 code
# -rw-rw-r--. 1 cpy cpy 37 12月 12 00:21 last-modified.txt
# drwxrwxr-x. 2 cpy cpy 41 12月 11 22:15 missing_semi
# drwxr-xr-x. 2 cpy cpy 6 9月 20 2022 公共
# drwxr-xr-x. 2 cpy cpy 6 9月 20 2022 模板
# drwxr-xr-x. 2 cpy cpy 6 9月 20 2022 视频
# drwxr-xr-x. 2 cpy cpy 6 9月 20 2022 图片
# drwxr-xr-x. 2 cpy cpy 6 10月 4 2022 文档
# drwxr-xr-x. 2 cpy cpy 6 9月 20 2022 下载
# drwxr-xr-x. 2 cpy cpy 6 9月 20 2022 音乐
# drwxr-xr-x. 2 cpy cpy 6 9月 20 2022 桌面

# 列出所有隐藏文件信息
ls -a
# . .bashrc .esd_auth .mozilla 公共 下载
# .. .cache .ICEauthority .pki 模板 音乐
# .bash_history code last-modified.txt .python_history 视频 桌面
# .bash_logout .config .local .viminfo 图片
# .bash_profile .dbus missing_semi .vscode 文档

# 参数组合
ls -la

# 通过管道符( | )配合tail命令获取最后一行的信息
ls -l | tail -n1
# drwxr-xr-x. 2 cpy cpy 6 9月 20 2022 桌面

ls -l 命令显示的每行的前10个字符表示文件权限。
第一个字符如果是”d”表示是文件夹,如果是”-“表示是文件。

接下来的九个字符,每三个字符构成一组(rwx)。
它们分别代表了文件所有者(missing),用户组(users)以及其他所有人具有的权限。
“-“代表没有某种权限。

对文件来说,”r”代表可以读取文件,”w”代表可以向文件中写入,”x”表示这个文件可以被执行。

对文件夹来说,”r”代表可以查看文件夹中的内容,”w”代表可以在文件夹中创建、删除、重命名文件和文件夹,
“x”表示可以访问文件夹中的内容或进入该文件夹.

通过 cd 命令进入某文件夹,需要它和它各级父目录的”x”权限。

3.3 mv

mv:移动文件到任意位置

1
2
# 移动文件到任意位置(如果文件夹名称相同则和重命名效果一样)
mv 路径/到/来源 路径/到/目标

3.4 cp

cp:复制文件到任意位置

1
2
3
4
5
6
7
8
# 复制一个文件到另外一个地方:
cp 文件的原始路径 文件的目标路径

# 复制一个文件到另外一个目录, 保持文件名不变:
cp 文件的原始路径 目标目录路径

# 递归的复制一个目录内的内容到另外一个地方(如果目标目录存在,目录被复制到目标目标内部):
cp -r 目录的原始路径 目标目录路径

3.5 mkdir

mkdir:创建一个空文件夹

1
2
# 创建文件夹
mkdir ./test

3.6 rmdir

rmdir:删除空文件夹

1
2
# 删除指定文件夹
rmdir ./test

3.7 rm

rm:删除指定文件

1
2
3
4
5
# 删除指定文件
rm last-modified.txt

# 递归删除某文件夹里的文件
rm -r ./missing_semi

4. 在程序间创建连接

在 shell 中,程序有两个主要的“流”:它们的输入流和输出流。

当程序尝试读取信息时,它们会从输入流中进行读取,当程序打印信息时,它们会将信息输出到输出流中。

通常,一个程序的输入输出流都是您的终端。也就是,您的键盘作为输入,显示器作为输出。但是,我们也可以重定向这些流!

最简单的重定向是 < file 和 > file。这两个命令可以将程序的输入输出流分别重定向到文件:

1
2
3
4
5
# 把hello输出到hello.txt
echo hello > hello.txt

# 从hello.txt读取数据输出到hello2.txt
cat < hello.txt > hello2.txt

使用 >> 来向一个文件追加内容。

1
2
3
4
cat < hello.txt >> hello2.txt
cat hello2.txt
# hello
# hello

使用管道(pipes),我们能够更好的利用文件重定向。| 操作符允许我们将一个程序的输出和另外一个程序的输入连接起来:

1
2
# 把ls的输出和tail的输入链接起来
ls -l / | tail -n1

5. 作业答案

Q1: 本课程需要使用类Unix shell,例如 Bash 或 ZSH。如果您在 Linux 或者 MacOS 上面完成本课程的练习,则不需要做任何特殊的操作。
如果您使用的是 Windows,则您不应该使用 cmd 或是 Powershell;您可以使用Windows Subsystem for Linux或者是 Linux 虚拟机。
使用echo $SHELL命令可以查看您的 shell 是否满足要求。如果打印结果为/bin/bash或/usr/bin/zsh则是可以的。

按要求输入echo $SHELL命令即可。

Q2: 在 /tmp 下新建一个名为 missing 的文件夹。

1
mkdir /tmp/missing

Q3:用 man 查看程序 touch 的使用手册。

1
man touch

Q4:用 touch 在 missing 文件夹中新建一个叫 semester 的文件。

1
2
cd /tmp/missing
touch semester

Q5:将以下内容一行一行地写入 semester 文件:

1
2
#!/bin/sh
curl --head --silent https://missing.csail.mit.edu

第一行可能有点棘手,# 在Bash中表示注释,而 ! 即使被双引号(”)包裹也具有特殊的含义。
单引号(’)则不一样,此处利用这一点解决输入问题。更多信息请参考 Bash quoting 手册

因为访问不上这个网址,于是我改成了访问百度。

1
2
3
4
# 注意字符串需要用单引号包裹
echo '#!/bin/sh' > semester
# 注意追加是用>>号在文件最后添加语句
echo 'curl --head --silent www.baidu.com' >> semester

Q6:尝试执行这个文件。例如,将该脚本的路径(./semester)输入到您的shell中并回车。如果程序无法执行,请使用 ls 命令来获取信息并理解其不能执行的原因。

输入ls -l查看文件权限发现,semester没有执行(x)权限

1
2
ls -l
# -rw-rw-r--. 1 cpy cpy 49 12月 12 00:04 semester

Q7:查看 chmod 的手册(例如,使用 man chmod 命令)

输入man chmod 命令即可

Q8:使用 chmod 命令改变权限,使 ./semester 能够成功执行,不要使用 sh semester 来执行该程序。
您的 shell 是如何知晓这个文件需要使用 sh 来解析呢?更多信息请参考:shebang

1
2
3
4
# 给所有用户都增加执行权限
chmod +x ./semester
# 执行代码
./semester

Q9:使用 | 和 > ,将 semester 文件输出的最后更改日期信息,写入主目录下的 last-modified.txt 的文件中

1
2
3
4
5
6
# 创建文件
touch ~/last-modified.txt

# 从 semester 文件输出筛选最后更改日期信息
# 重定向输出流到last-modified.txt
./semester | grep -i "Date" > /home/last-modified.txt

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2022-2026 CPY
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信