shell、bash、terminal和kernel之间的关系

shell、bash、terminal和kernel之间的关系

本文是《鸟哥的Linux私房菜》的学习笔记html

什么是kernel

kernel的中文是“操做系统核心”,主要用于管理硬件和提供相关的能力实现,例如存取硬盘、网络功能、CPU资源获取等。关于knernel和各个linux发行版之间的关系,这篇文章说的很好:linux

来源:https://www.fdzh.org/slides/2015/06/20/linux-distr/shell

Linux 发行版是什么,它又与Linux内核有什么联系?

Linux内核是计算机操做系统的核心。一个完整的 Linux发行版包括了内核与一些其余与文件相关的操做,用户管理系统,和软件包管理器等一系列软件。每一个工具都是整个系统的一小部分。这些工具一般都是一个个独立的项目,有相应的开发者来开发及维护。ubuntu

前面提到的Linux内核,包括现行版本,以及历史版本(即更早发布的版本)均可以在 www.kernel.org 找到。Linux的众多发行版多是基于不一样的内核版本的。例如:流行的 RHEL6发行版是基于很老可是很稳定的 2.6.32 版本的Linux内核的。其余的一些发行版可能会很快的更新以适应最新的内核版本。须要特别注意的一点是,内核并非一个非此即彼的命题,例如RHEL6就在2.6.32的内核中引进了新版本内核的许多改进。vim

各发行版提供的其余基本工具和组成部分还有包括如下的内容:C/C++编译器,gdbdebugger 调试工具,核心系统库应用程序,用于在屏幕上绘图的底层接口以及高级的桌面环境,以及供安装和更新包括内核在内的众多组建的系统bash

众多不一样的Linux发行版知足了不一样用户及组织的不一样需求。大型商业机构一般倾向于使用来由 Red Hat、 SUSE 及 Canonical (Ubuntu)提供的发行版。服务器

Fedora 是基于RHEL,CentOS,Scientific Linux, 和Oracle Linux的社区版本。相比RHEL,Fedora打包了显著的更多的软件包。其中一个缘由是,多样化的社区参与Fedora的建设;它不仅是一家公司。在这个过程当中,CentOS用于活动,演示和实验,由于它是对最终用户免费提供的,并具备比Fedora的一个更长的发布周期(一般每隔半年左右发布一个新版本)。网络

SUSE, SUSE Linux Enterprise Server (SLES), 和openSUSE 之间的关系相似于 Fedora, Red Hat Enterprise Linux, 和CentOS的关系。ssh

Debian是包括Ubuntu在内许多发行版的上游,而Ubuntu又是Linux Mint及其余发行版的上游。Debian在服务器和桌面电脑领域都有着普遍的应用。Debian是一个纯开源计划并着重在一个关键点上,稳定性。它同时也提供了最大的和完整的软件仓库给用户。ide

注: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/ <用户名> 的目录下

来源:https://linux.cn/article-9298-1.html

bash 是一个能解释你输入进终端程序的东西,而且基于你的输入来运行命令。它在必定程度上支持使用脚原本定制功能,这时候就要用到 .bashrc 了。

为了加载你的配置,bash 在每次启动时都会加载 .bashrc 文件的内容。每一个用户的 home 目录都有这个 shell 脚本。它用来存储并加载你的终端配置和环境变量。

进入.bashrc

vim ~/.bashrc

打开以后能够看到有许多项。

咱们能够在这里追加alias来为命令取别名,从而简化在terminal中的输入。例如,咱们能够将经常使用的ssh链接命令取别名,这样就不须要每次都输入一长串了。

bash的运行模式

来源:http://blog.sciencenet.cn/blog-3238131-1037461.html

Bash有几种不一样的运行模式,login shell与non-login shell,interactive shell与non-interactive shell(好比执行shell脚本)。这两种分类方法是交叉的,也就是说一个login shell多是一个interactive shell,也多是个non-interactive shell。

在下列状况下,咱们能够得到一个login shell:

  1. 登陆系统时得到的顶层shell,不管是经过本地终端登陆,仍是经过网络ssh登陆。这种状况下得到的login shell是一个交互式shell。
  2. 在终端下使用--login选项调用bash,能够得到一个交互式login shell。
  3. 在脚本中使用--login选项调用bash(好比在shell脚本第一行作以下指定:#!/bin/bash --login),此时获得一个非交互式的login shell。
  4. 使用"su -"切换到指定用户时,得到此用户的login shell。若是不使用"-",则得到non-login shell。

login shell与non-login shell的主要区别在于它们启动时会读取不一样的配置文件,从而致使环境不同。login shell启动时首先读取/etc/profile全局配置,而后依次查找~/.bash_profile、~/.bash_login、~/.profile三个配置文件,而且读取第一个找到的而且可读的文件。login shell退出时读取并执行~/.bash_logout中的命令。
交互式的non-login shell启动时读取~/.bashrc资源文件。非交互式的non-login shell不读取上述全部配置文件,而是查找环境变量BASH_ENV,读取并执行BASH_ENV指向的文件中的命令。

一般咱们要定制一些配置时,将配置写在~/.bashrc中,而后在~/.bash_profile中读取~/.bashrc,这样能够保证login shell和交互式non-login shell获得相同的配置。至于/etc/profile就不要轻易去改啦,毕竟会影响系统全局的配置。

相关文章
相关标签/搜索