03-走进Shell
03-走进Shell
认识Shell
首先我们必须理解什么是Linux Shell?怎么去使用Linux Shell?
Linux Shell 是一种命令行界面(CLI),它允许用户通过输入一系列命令与操作系统进行交互。Shell是一个脚本解释器,用户可以在其中编写和执行脚本来实现一系列的操作,包括文件操作、网络操作、系统配置等等。
而Shell是一种命令语言,同时也是一种程序设计语言。它是用户和Linux沟通的桥梁。Shell也是操作系统中的一个软件,它包含在Linux内核的外面,为用户和内核提供一个交互接口,用shell去进行解释,再发送给Linux内核。
Shell在计算机中的位置如图:

注意:在Windows中,同时存在CMD和Powershell两种命令行语言。
Shell主要有这些功能:
- 解释和执行用户输入的命令
- 控制和管理文件和目录
- 启动和停止程序和进程
- 管理网络连接和配置
- 提供安全性和访问控制的功能
- 执行脚本和Shell脚本
- 提供用户界面和交互的功能

Shell对于用户输入的命令,有以下三种处理方式:
- 如果用户输入的是内置命令,那么由Shel的内部解释器进行解释,并交由内核执行。
- 如果用户输入的是实用程序命令,而且给出了命令的路径,那么Shell会按照用户提供的路径在硬盘中查找。如果找到则调入内存,交由内核执行;否则输出提示信息。
- 如果用户输入的是实用程序命令,但是没有给出命令的路径,那么SheIl会根据PATH环境变量所指定的路径依次进行查找。如果找到则调入内存,交由内核执行;否则输出提示信息。
常见的Shell类型有哪些?
- Bash(Bourne Again SHell):是大多数Linux发行版中最常用的Shell。
- SH(Bourne SHell):是最初的Unix Shell,由Steve Bourne开发。
- C Shell(csh):语法类似于C语言。
- Korn Shell(ksh):SH的扩展,提供更多功能和更友好的命令行编辑。
- Z Shell(zsh):是一个为交互使用设计的强大的命令解释器,Kali Linux默认使用的就是Zsh。
命令提示符
如果你使用的是桌面端,需要这样打开终端,如果是命令行界面就不用。如图:

进入之后我们可以看见和命令行界面一样的字符串,如图:

看到前面的命令提示符就说明可以输入命令了,注意命令提示符不是命令的一部分,只是一个提示的作用。我们来看看Fedora的命令提示符吧,如图:

基于RHEL(红帽)的操作系统都是这样子的提示符风格,其中的含义如下:
miui
是用户名@
是分隔符号,没有特殊含义fedora
是当前系统的主机名:
也是分隔符号,没有特殊含义~
代表当前用户所在的住目录(home目录),如果是在其他目录中,那么符号会编程对应目录的名称$
符号是权限符号,如果是root用户,符号会变成#
大多数Linux系统中默认使用的shell都是Bash shell,如果我们要知道自己使用的是什么shell,我们可以在终端中输入如下命令:

可以看见当我们输入echo $SHELL
之后,系统返回了一串字符,/bin/bash
这表示我们系统当前使用的shell是bash shell。
shell命令的语法
shell命令的基本格式如下
command [选项] [参数]
选项一般是--help或者-h,-H之类的,每一个选项都有对应的功能,并且可以简写,简写规则需要查看对应的帮助,参数就是我们要修改的文件等。
例如,我们使用对应的命令的时候,在后面添加--help就可以看到使用手册,如图:

常见的命令
我们常见的命令有哪些呢?或者是很基础的命令有哪些?
首先最简单的就是获取当前系统时间和时区。如图:

我们使用date命令就可以获取到当前的年月日、星期、点钟、时区。
我们还可以使用一些其他的命令,比如我们当前命令行所处什么位置?我们使用pwd
命令就可以查看当前的工作目录。

我们还可以使用hostname
来查看当前的主机名,如图:

还可以使用ls
来查看当前工作目录有那些文件,如图:

使用id
就可以查看用户的身份信息,如图:

警告
注意:启用了SELinux的Linux发行版,例如Fedora或者RHEl其他系列的Linux,在id的的输出信息中会显示额外的信息,如上图的“上下文=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023”字符串信息内容,没有启用SELinux安全行的话是没有这串字符信息的。
如何查看我们当前登陆的会话信息呢?我们可以使用who
命令来进行查看,我们在后面添加上参数-uH
就可以以人类语言的方式来读取,如图:

这里的tty是虚拟控制台,也就是我们开启的虚拟终端(当前窗口),第一个是我们使用图形界面才会出现的东西,如果你使用Server命令行界面的时候,就不回出现这个login screen
。
检测网络连接我们可以使用ping
命令。语法:
ping 网址
如图:

如果我们的命令太多怎么办?我们可以使用clear
来实现shell终端信息清屏操作,请看案例:

命令存放路径
我们命令存放在什么位置的呢?命令也是有区别的,如有shell内置命令、外部命令、别名、函数、shell保留字、特殊命令等多种命令。
我们可以使用echo $PATH
命令来查看Linux用户常见的默认路径。如图:

通常情况,大多数用户命令都存储在/bin, /user/bin, /user/local/bin目录中,而/sbin和/user.sbin包含一些系统管理员的一些管理命令,主要用于管理操作系统。
注
提示:如果想添加自己编写的命令或者Shell脚本,我们可以把他放在主目录的bin目录中,也可以放在用户的/home/chris/bin目录中。在部分Linux系统中,会自动将目录添加到路径中,这时候就只需要添加PATH(路径)到环境变量中即可。环境变量后续会讲解,这里提示下即可。
超级用户
在Linux操作系统中,我们除了自己创建的用户,还存在超级用户,超级用户root,这是权限最高的用户,非常危险,需要谨慎使用。
我们可以使用su
和sudo
命令来切换用户。
su
su
命令允许一个普通用户切换到另一个用户账户,通常是切换到root账户。
语法如下:
su [options] [username]
options
是选项,username
是用户名,例如:
su # 切换到root用户,需要输入root密码
su - # 以登录shell的方式切换到root用户
su - username # 切换到名为username的用户账户
切换用户的时候需要输入对应用户的密码。
警告
在大多数Linux发行版中,安装过程中通常会创建一个普通用户账户,而root账户则会被默认禁用或者没有设置密码。这是出于安全考虑,防止未经授权的用户获得超级用户权限。我们之前安装带桌面的WorkStation的时候就没有设置过root账户,而我们安装Server的时候是手动设置过root账户的密码的,所以这个时候我们要为root账户设置密码。
如果使用su无法切换到root用户,请使用下面的sudo方法进行提权或者修改root密码,再切换到root账户。
成功切换如图:

sudo
sudo
命令允许授权用户以超级用户或其他用户的身份执行命令。与su不同,sudo不需要知道root密码,而是使用用户自己的密码。
语法如下:
sudo [options] command
修改root账户密码
我们可以利用这一点来设置root账户的密码。方便我们以后切换到root账户获取更高的权限。
sudo passwd root
如图:

警告
我们前后必须保证密码的一致性,四位数密码也是可以设置的,只是由于安全性考虑我们不得不提升密码的安全性。所以在学习过程中我们可以使用简单的密码,方便记忆,但是在工作中,必须要设置安全系数较高的密码,通常是大小写英文+特殊符号+数字不低于8位数。
密码修改成功如下:

然后就可以使用su进行账户切换,如图:

sudo模拟root账户
sudo主要适用于提权操作,并不能直接切换到root账户,如果要切换到root账户,我们需要使用su命令。
比如我们要进行某些操作的时候,比如升级软件和依赖之类的,文件读写运行,我们很多时候需要使用root权限来进行操作,这个时候只需要在命令的前面添加上sudo即可。
还有我们经常使用的sudo -i
,可以进入到root环境里面去。

可以看见我们进入的是带有root的shell环境中,和su的效果差不多,都能让你用root权限去执行命令,但是本子上还是有很多区别。
注意
很多人是误以为这是切换到了root账户,其实这不是账户的切换,而是我们在交互的shell中以超级用户的身份去执行交互式命令,他会尝试去模拟root Shell的行为,你可以理解他开启了一个带有 root 权限的 shell,你本质上还是在当前用户,而不是直接切换到了root用户。
其次sudo -i
加载的是root用户的环境配置,而su
不会加载目标用户的环境文件,他只会保留但当前用户环境。你可以看图片中的细节:

退出root环境
我们如果想要回到原本的用户shell中我们该怎么办呢?
我们只需要在命令行中输入exit
即可退出当前shell环境,包括基础用户环境。如图:

命令行编辑
vim编辑器
我们可以使用Linux中的最强命令行编辑器vim来进行编辑,vim是vi编辑器的升级版,功能性和拓展性更强;和Emacs并列成为类Unix系统用户最喜欢的文本编辑器。

我们如何使用?如何使用vim,首先你要进行安装,如果你在安装系统的时候勾选了开发模块,那么默认你就有vim编辑器,否则默认安装的只有Vi编辑器。

当我们想编辑一个文件的时候,只需要在命令行中输入如下命令:
vim [filename]
vim会进入文件中进行编辑,如果当前文件不存在,那么会自动创建一个文件。
vim工作模式
vim编辑器有三种编辑模式,分别是命令模式、编辑模式和末行模式。

命令模式
命令模式是vim启动后的默认模式,在这个模式下可以使用命令来进行操作,比如文本替换、删除、光标移动,但是不能直接输出文本。
常见的一些操作如下:
按键操作 | 功能描述 |
---|---|
h或← | 向左移动光标 |
j或↓ | 向下移动光标 |
k或↑ | 向上移动光标 |
l或→ | 向右移动光标 |
w | 移动到下一个单词的开始 |
b | 移动到上一个单词的开始 |
e | 移动到下一个单词的结束 |
0 | 移动到行首 |
$ | 移动到行尾 |
gg | 移动到文件的第一行 |
G | 移动到文件的最后一行 |
dd | 删除当前行 |
dw | 删除当前单词 |
d$ | 删除光标到行尾的内容 |
x | 删除光标下的字符 |
p | 粘贴剪切板中的内容 |
y | 复制文本 |
yy | 复制当前行 |
yw | 复制当前单词 |
u | 撤销最近的更改 |
Ctrl r | 重做最近的撤销 |
/search | 向前搜索search 字符串 |
?search | 向后搜索search 字符串 |
n | 查找下一个搜索匹配项 |
N | 查找上一个搜索匹配项 |
注意:如果在某些文本操作的按键前面添加数字,就可以实现多行删除、多行复制。
插入模式
在插入模式中我们可以对文件进行编辑,和富文本编辑器一样,直接在文件中任意编写和粘贴内容。要退出插入模式并返回命令模式,可以按Esc键。
按键操作 | 功能描述 |
---|---|
i | 在光标位置前插入文本 |
I | 在当前行的行首插入文本 |
a | 在光标位置后插入文本 |
A | 在当前行的行尾插入文本 |
o | 在当前行下方插入新行并进入插入模式 |
O | 在当前行上方插入新行并进入插入模式 |

莫行模式
末行模式也称为冒号模式,在命令模式下按:键可以进入。在这个模式下,您可以执行文件操作、搜索和替换文本、设置Vim选项等。
按键操作 | 功能描述 |
---|---|
:w | 保存文件 |
:q | 退出Vim(如果没有更改) |
:q! | 强制退出Vim,不保存更改 |
:wq | 保存文件并退出 |
:e filename | 打开新文件filename进行编辑 |
/string | 在文件中查询名为string的字符串 |
?string | 在光标之上查询名为string的字符串 |
n | 重复前一个查找动作(向后查找) |
N | 反向进行前一个查找动作(向前查找) |
😒/search/replace | 将当前行中的第一个search替换为replace |
:%s/search/replace/g | 将整个文件中的所有search替换为replace |
:set number | 显示行号 |
:set nonumber | 不显示行号 |
:help | 打开Vim帮助文档 |
这部分内容只有在你编辑文本的时候才会使用到。

命令行其他操作
补全与提示
命令很多,有时候我们没有办法全部记住,这个时候就可以利用命令行补全这个功能,在键盘上,有一个Tab
按键,我们在使用命令的时候按住Tab就可以补全和命令提示。
例如,当我不知道有那些命令的时候,我可以输入几个字符,然后Tab键查看,如图:

技巧:
当Tab键只能返回一个内容的时候就会进行自动命令补全,例如当你输入上面的
sysc
,按住Tab就可以补全成sysctl
,当然,我们还可以连续使用Tab来进行操作。我们可以直接输入
syst
,她会自动补全成大家都有的共同字符,比如补全之后就是system
,这是所有的命令都包含的特征,后面我们再根据自己想要使用的命令输入字符,比如我输入c
,那么最后会直接补全成systemctl
。这就是Tab补全技巧。
重复执行
在Linux操作系统中我们还可以使用命令行重复执行这个操作。我们所有输入的命令都在在shell中进行一个保存,放在历史列表和.bash_history
文件中。
我们可以通过history
来查看历史命令。如图:

我们还可以通过追加数字的方式查看最近的几条命令,例如:
history 8
这个操作是包含当前命令的历史记录的,如图:

列表前面有一个编号,这个编号我们可以利用起来,从而实现命令的重复执行。我们可以通过一个感叹号(!)来进行实现。
我们可以通过编号来执行已经使用过的命令,语法为!n
,这个n就是历史命令前面的编号如图:

我们还可以使用!!
来运行前一个命令,如图:

我们还可以使用!?string?
的方式来运行包含某些字符串的命令。??
里面的内容会自动与Linux中的shell命令进行匹配,找到相对应的命令,如图:

我们还可以使用上下按键来浏览历史命令。

多行执行
我们还可以实现多行命令执行的操作,这种操作一般是利用富文本编辑器的第三方Shell终端来实现,或者是在复制粘贴大量命令的时候来使用。
多行执行的特点,我们的每一行都是一条命令,并且是可自行没有错误的命令。操作如下:
ls
pwd
date
当我们同时使用这三条命令的时候,shell会依次从上至下依次执行。如图:

命令的内容被一次性执行,并且按顺序返回到终端显示。
连续命令
连续命令这个操作一般会夹杂这正则表达式使用,什么是正则表达式?这个内容我们在后面讲解环境变量的时候一次性讲解,这知道有这个东西就可以了。
比如我们要执行多条命令的时候可以通过;
的方式进行隔开,这个执行的效果和上面的多行执行效果一样,都是按顺序进行命令执行。
如下图:

后台命令
一些命令要用很长的时间才能执行,我们有时候不想让他占用我们正在使用的shell,这样会让我们等待时间太长,这时候后台命令的作用就体现出来了。
这个情况我们可以使用与符号&
让命令在后台进行执行。语法如下
执行命令 &
这里以ping命令为例,如果您想在后台执行ping命令来持续监控与一个网站的连接情况,可以这样做:
ping miui.com &
执行上述命令后,ping命令会在后台运行,并且您会看到一个作业号和进程ID(PID),如下所示:

并且你无法使用使用CTRL+C退出操作,会一直刷屏。这个时候只有通过杀进程的方式退出,我们使用kill来杀死进程。如图:

更多操作我们将在后面的进程与后台篇章进行学习。