The Missing Semester of Your CS Education

前言

本内容是完全契合一生一芯的要求的,所以才写的这个帖子,写这个帖子的终极目的是为了自己学习,同时也是为了给其他人指一条明路,让大家都能好好地学习下去,详细地给大家指导指导。本内容会尽量遵守学术诚信的,那么话不多说,我们开始吧。

课程概览与Shell

Shell是一种命令行终端,允许用文字接口来和计算机互动。而bash是Bourne Again SHell的缩写,它是Shell的一种。

如果你要求 shell 执行某个指令,但是该指令并不是 shell 所了解的编程关键字,那么它会去咨询 环境变量 $PATH。它会列出当 shell 接到某条指令时,进行程序搜索的路径:

确定某个程序名代表的是哪个具体的程序,可以使用 which 程序。我们也可以绕过 $PATH,通过直接指定需要执行的程序的路径来执行该程序。

shell 中的路径是一组被分割的目录,在 Linux 和 macOS 上使用 / 分割。路径 / 代表的是系统的根目录,所有的文件夹都包括在这个路径之下。如果某个路径以 / 开头,那么它是一个 绝对路径,其他的都是 相对路径 。相对路径是指相对于当前工作目录的路径,当前工作目录可以使用 pwd 命令来获取。此外,切换目录需要使用 cd 命令。在路径中,. 表示的是当前目录,而 .. 表示上级目录。所以说很多时候我们想执行当前目录的某个文件的时候,我们通常是./xxx,因为.表示的是当前目录!

ls命令是list的缩写,可以用来查看指定的目录下包含哪些文件。除非我们利用第一个参数指定目录,否则 ls 会打印当前目录下的文件。大多数的命令接受标记和选项(带有值的标记),它们以 - 开头,并可以改变程序的行为。比如下面这个,ls -l /home就会把/home目录下的所有文件展示出来,且是以长列表的形式展示出来。

这个参数可以更加详细地列出目录下文件或文件夹的信息。首先,本行第一个字符 d 表示 missing 是一个目录。然后接下来的九个字符,每三个字符构成一组。 (rwx). 它们分别代表了文件所有者(missing),用户组(users) 以及其他所有人具有的权限。其中 - 表示该用户不具备相应的权限。从上面的信息来看,只有文件所有者可以修改(w),missing 文件夹 (例如,添加或删除文件夹中的文件)。为了进入某个文件夹,用户需要具备该文件夹以及其父文件夹的“搜索”权限(以“可执行”:x)权限表示。为了列出它的包含的内容,用户必须对该文件夹具备读权限(r)。对于文件来说,权限的意义也是类似的。注意,/bin 目录下的程序在最后一组,即表示所有人的用户组中,均包含 x 权限,也就是说任何人都可以执行这些程序。

在这个阶段,还有几个趁手的命令是您需要掌握的,例如 mv(用于重命名或移动文件)、 cp(拷贝文件)以及 mkdir(新建文件夹)。我们讲一下这仨都是咋用的,

mv命令用于移动文件或目录,也可以用来重命名文件或目录。基本语法:

mv [选项] 源 目标

重命名文件:

mv oldfilename newfilename

这条命令将 oldfilename 重命名为 newfilename

移动文件到另一个目录:

mv file.txt /path/to/destination/

这条命令将 file.txt 移动到 /path/to/destination/ 目录下。

移动多个文件到另一个目录:

mv file1.txt file2.txt /path/to/destination/

这条命令将 file1.txtfile2.txt 移动到 /path/to/destination/ 目录下。

cp命令用于复制文件或目录。基本语法:

cp [选项] 源 目标

常用选项:

  • -r 或 --recursive:递归复制目录及其内容。
  • -i 或 --interactive:在覆盖已存在的文件前提示用户。

复制文件:

cp sourcefile.txt destinationfile.txt

这条命令将 sourcefile.txt 复制到 destinationfile.txt

复制目录:

cp -r sourcedir/ destinationdir/

这条命令将 sourcedir 目录及其内容递归地复制到 destinationdir 目录下。

交互式复制:

cp -i sourcefile.txt destinationfile.txt

如果 destinationfile.txt 已经存在,这条命令会在覆盖前提示用户确认。

mkdir命令用于创建新的目录。基本语法:

mkdir [选项] 目录名

常用选项:

  • -p 或 --parents:创建多级目录,如果上级目录不存在则一并创建。

创建单个目录:

mkdir newdirectory

这条命令将在当前目录下创建名为 newdirectory 的目录。

创建多级目录:

mkdir -p path/to/newdirectory

这条命令将创建 path/to/newdirectory,如果 pathto 目录不存在,也会一并创建。

在程序间创建连接

在 shell 中,程序有两个主要的“流”:它们的输入流和输出流。 当程序尝试读取信息时,它们会从输入流中进行读取,当程序打印信息时,它们会将信息输出到输出流中。一个程序的输入输出流都是我们的终端,也就是我们的键盘作为输入,显示器作为输出。 但是,我们也可以重定向这些流。

最简单的重定向是 < file 和 > file。这两个命令可以将程序的输入输出流分别重定向到文件,就比如下面的代码。我们来分析一下,echo hello > hello.txt表示这个命令将字符串 hello 写入到文件 hello.txt 中。如果文件不存在,它会被创建;如果文件已存在,它的内容将被覆盖。cat hello.txt这个命令用于显示文件 hello.txt 的内容,cat的全称是concatenate,翻译过来就是连接、合并。cat < hello.txt这个命令使用输入重定向 <hello.txt 文件的内容作为 cat 命令的输入。效果与直接使用 cat hello.txt 相同。cat < hello.txt > hello2.txt这个命令使用输入重定向 <hello.txt 文件的内容作为 cat 命令的输入,然后使用输出重定向 >cat 命令的输出写入到 hello2.txt 文件中。如果 hello2.txt 不存在,它会被创建;如果存在,它的内容将被覆盖。cat hello2.txt这个命令用于显示文件 hello2.txt 的内容。

missing:~$ echo hello > hello.txt
missing:~$ cat hello.txt
hello
missing:~$ cat < hello.txt
hello
missing:~$ cat < hello.txt > hello2.txt
missing:~$ cat hello2.txt
hello

您还可以使用 >> 来向一个文件追加内容。使用管道( pipes ),我们能够更好的利用文件重定向。 | 操作符允许我们将一个程序的输出和另外一个程序的输入连接起来,如下面的代码所示。ls -l / | tail -n1解释一下:

这个代码的目的是列出根目录下的最后一个条目

  • ls -l /:列出根目录 (/) 下的所有文件和目录的详细信息。
  • |:管道符,将前一个命令的输出作为下一个命令的输入。
  • tail -n1:显示最后一行。

curl --head --silent google.com | grep --ignore-case content-length | cut --delimiter=' ' -f2
219这个代码的目的是获取 Google 主页的 Content-Length 头信息:

  • curl --head --silent google.com:发送 HTTP HEAD 请求到 google.com,并静默输出响应头信息。
    • --head:发送 HTTP HEAD 请求,只返回响应头,不返回响应体。
    • --silent:静默模式,不显示进度或错误信息。
  • |:管道符,将前一个命令的输出作为下一个命令的输入。
  • grep --ignore-case content-length:搜索包含 content-length 的行,忽略大小写。
    • --ignore-case:忽略大小写。
  • cut --delimiter=' ' -f2:从匹配的行中提取第二个字段,字段分隔符为空格。
    • --delimiter=' ':指定字段分隔符为空格。
    • -f2:提取第二个字段。
missing:~$ ls -l / | tail -n1
drwxr-xr-x 1 root  root  4096 Jun 20  2019 var
missing:~$ curl --head --silent google.com | grep --ignore-case content-length | cut --delimiter=' ' -f2
219

一个功能全面又强大的工具

我们会在需要的时候使用 sudo 命令。顾名思义,它的作用是让您可以以 su(super user 或 root 的简写)的身份执行一些操作。 当您遇到拒绝访问(permission denied)的错误时,通常是因为此时您必须是根用户才能操作。然而,请再次确认您是真的要执行此操作。

|>、和 < 是通过 shell 执行的,而不是被各个程序单独执行。 echo 等程序并不知道 | 的存在,它们只知道从自己的输入输出流中进行读写。

通过输入su,之后输入密码即可进入root模式,注意Linux系统中,对密码有显示保护,你在输入密码的时候,屏幕上不会显示任何内容,所以一定要注意!

课后练习

我们打开终端,输入

echo $SHELL

结果如下:

我们使用mkdir命令,在tmp下新建一个文件夹,不过这里为了便于我们总结作业题,所以我在home目录下新建一个文件夹命名为ShellExperience,在里面完成所有的操作。如下图所示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值