shell、bash、terminal和kernel之间的关系
本文是《鸟哥的Linux私房菜》的学习笔记
什么是kernel
kernel的中文是“操作系统核心”,主要用于管理硬件和提供相关的能力实现,例如存取硬盘、网络功能、CPU资源获取等。关于knernel和各个linux发行版之间的关系,这篇文章说的很好:
注:Debian、Cent OS等等和Ubuntu一样,都是发行版本,指的就是基于linus维护的linux内核,是由一些厂商集成了漂亮易用的桌面和常用的软件而发布的商品。但是一部分发行版继承了另一部分发行版的功能,例如Ubuntu和Debian。内核版本只由linux的开发团队开发
关于各个发行版之间的比较,可以看这篇文章:https://www.zhihu.com/question/29406367
可以使用uname -a查看所使用的发行版的内核版本:例如我ubuntu 18.04查询的结果是5.0.0-32-generic
,查询网络可知,这个包包括的是“ the unsigned Linux kernel image for version 5.0.0 on ARMv8 SMP.”
什么是shell和bash
shell的意思是“壳程序”,指的是能对操作系统和应用程序进行操作的接口程序,狭义的壳程序指的是命令行方面的软件,例如bash;广义上也包括图形界面下的程序。
shell不止有一种。在计算机历史的长河里,有许多种shell,例如:
- Bourne shell(简称为sh):第一个shell
- C shell(简称为csh):由于语法和C语言类似而得名
- Bourne Again Shell(简称为bash):这是对Bourne shell的增强版本
- Tenex C shell(简称tcsh):是C shell的增强版本
我们的Linux默认使用的是bash,但是其实支持许多类型的。可以通过这个命令查看linux支持的shell:vim /etc/shells
.
不同shell的语法有差异。Linux默认使用的shell是bash,所以我们只需要学会bash,就能快乐的使用任意一个linux发行版了!
刚才我们提到的/etc/shells,其实是/etc目录下的一个文件,打开之后就能看到:
1 # /etc/shells: valid login shells
2 /bin/sh
3 /bin/bash
4 /bin/rbash
5 /bin/dash
这个文件用来记录系统中可以使用的shell的位置,但是只是一部分,不是全部。当系统进行某些服务时就能够依据这个文件的记录来进行操作。
/etc目录下还有一个文件叫passwd,我们使用vim打开看一下:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
不同的用户登录系统时,系统就会给我们一个默认shell来进行工作,那这个不同使用者默认的shell分别是什么哪?这些记录就都在/etc/passwd文件中。它可以帮助系统控制用户的权限,例如像这里的root用户可以使用bash,但是像一些权限较低的用户,例如这里的daemon和bin用户(这两个都是系统账号),就使用一个叫做nologin的shell,这个shell中限制了功能,从而限制了他们对系统的修改和对系统功能的使用。同样的,我们可以使用chsh命令来更换shell,但是更换的结果需要重启shell后才能体现出来。
另外,一些程序会根据/etc/shells这个文件来判断一个用户是否是有效用户,例如有些FTP服务会阻止那些shell不在/etc/shells里的用户登陆。这样,那些我们在/etc/passwd中设置了登录shell不在那个列表中的用户就不能使用这台主机上的ftp服务了
这样,我们就知道什么是shell和bash了吧
什么是terminal
我们在Linux下使用的terminal,实际上是一个“终端模拟软件”,它模拟了一台真正的终端,也就是几十年前时候的终端:只包括键盘+显示器,甚至是再之前时的电传打字机。现在,我们用的终端软件指的是可以运行shell命令的软件。它一般是捆绑在桌面环境上的,例如gnome terminal等等,我们自己也可以安装另外的terminal.它就是类似于输入法的一个应用程序。
什么是.bashrc
.bashrc位于/home/<用户名>的目录下
进入.bashrc
vim ~/.bashrc
打开之后可以看到有许多项。
我们可以在这里追加alias来为命令取别名,从而简化在terminal中的输入。例如,我们可以将常用的ssh连接命令取别名,这样就不需要每次都输入一长串了。