前言
本内容是完全契合一生一芯的要求的,所以才写的这个帖子,写这个帖子的终极目的是为了自己学习,同时也是为了给其他人指一条明路,让大家都能好好地学习下去,详细地给大家指导指导。本内容会尽量遵守学术诚信的,那么话不多说,我们开始吧。
课程概览与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.txt
和 file2.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
,如果 path
和 to
目录不存在,也会一并创建。
在程序间创建连接
在 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,在里面完成所有的操作。如下图所示: