shell、bash、terminal和kernel之間的關系
本文是《鳥哥的Linux私房菜》的學習筆記
什么是kernel
kernel的中文是“操作系統核心”,主要用於管理硬件和提供相關的能力實現,例如存取硬盤、網絡功能、CPU資源獲取等。關於knernel和各個linux發行版之間的關系,這篇文章說的很好:
來源:https://www.fdzh.org/slides/2015/06/20/linux-distr/
Linux 發行版是什么,它又與Linux內核有什么聯系?
Linux內核是計算機操作系統的核心。一個完整的 Linux發行版包括了內核與一些其他與文件相關的操作,用戶管理系統,和軟件包管理器等一系列軟件。每個工具都是整個系統的一小部分。這些工具通常都是一個個獨立的項目,有相應的開發者來開發及維護。
前面提到的Linux內核,包括現行版本,以及歷史版本(即更早發布的版本)都可以在 www.kernel.org 找到。Linux的眾多發行版可能是基於不同的內核版本的。例如:流行的 RHEL6發行版是基於很老但是很穩定的 2.6.32 版本的Linux內核的。其他的一些發行版可能會很快的更新以適應最新的內核版本。需要特別注意的一點是,內核並不是一個非此即彼的命題,例如RHEL6就在2.6.32的內核中引進了新版本內核的許多改進。
各發行版提供的其他基本工具和組成部分還有包括以下的內容:C/C++編譯器,gdbdebugger 調試工具,核心系統庫應用程序,用於在屏幕上繪圖的底層接口以及高級的桌面環境,以及供安裝和更新包括內核在內的眾多組建的系統
眾多不同的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的關系。
Debian是包括Ubuntu在內許多發行版的上游,而Ubuntu又是Linux Mint及其他發行版的上游。Debian在服務器和桌面電腦領域都有着廣泛的應用。Debian是一個純開源計划並着重在一個關鍵點上,穩定性。它同時也提供了最大的和完整的軟件倉庫給用戶。
注: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:
- 登錄系統時獲得的頂層shell,無論是通過本地終端登錄,還是通過網絡ssh登錄。這種情況下獲得的login shell是一個交互式shell。
- 在終端下使用--login選項調用bash,可以獲得一個交互式login shell。
- 在腳本中使用--login選項調用bash(比如在shell腳本第一行做如下指定:#!/bin/bash --login),此時得到一個非交互式的login shell。
- 使用"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就不要輕易去改啦,畢竟會影響系統全局的配置。
