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就不要輕易去改啦,畢竟會影響系統全局的配置。

相關文章
相關標籤/搜索