1. 程式人生 > >燕姐的 Linux 私房菜之(1)—— Linux 簡介

燕姐的 Linux 私房菜之(1)—— Linux 簡介

1、作業系統與硬體

無論是 Linux、OS X、Windows 作業系統,他們都是由以下部分組成(分層結構):
最底層:硬體;
底層之上:將硬體的介面抽象成為系統呼叫(kernel);
再之上:庫;
在此之上為:應用程式。
程式的執行可以有兩種方式:
(1)開機自動啟動執行;
(2)使用者通過互動式介面登陸或者連線系統上去,來手動執行程式。
使用者可以通過互動式介面對系統及其程式進行操作、配置管理。
系統的執行獨立於使用者的互動式介面,介面有無,都不影響系統及其程式的執行,所以互動式介面不是必須的,但是有些程式是建立在互動式介面之上的。
我們平時如果對系統進行控制,可以有這麼幾種方法:
(1)遠端主機有電源線、網線(但沒有鍵盤、顯示器、滑鼠等),我們可以通過遠端連線進入;
(2)遠端連入時,主機系統就必須提供一個可以遠端接入進來的一個互動式介面,這個互動式介面的輸出可以是本地的 vga 輸入,也可以是顯示到遠端終端上去。

2、終端

終端,使用者與主機互動,是必然用到的裝置。
早期的大型主機,想使用的使用者有很多,但主機只有一個,也不可能做到人手一臺,但是可以做到在主機上接上一個分屏器,分屏器的每一個端子上可以接上一套鍵盤滑鼠顯示器,就可以直接在主機上面進行一些操作了,這就相當於每個人在獨立的操作一臺計算機一樣,像這樣我們把一個端子上面所接入的滑鼠、鍵盤、顯示器所組成的一個組合,我們就稱之為終端。
所謂作業系統的多使用者概念,就是基於此種模式而誕生的。終端可以說是一個程式,但嚴格意義上來講是一個裝置,因為終端所表現的是一些物理裝置,如鍵盤、滑鼠、顯示器等。
我們可以通過終端來與作業系統或者主機進行互動,終端的型別也比較多,如
(1)物理終端:我們可以將顯示器、鍵盤滑鼠直接接在主機的介面之上,這樣的終端稱之為物理終端,即本機自帶的,直接連入的,我們也稱之為:物理控制檯 console,表示為 /dev/console;
(2)虛擬終端:除了物理終端,系統會提供給我們 6 個虛擬終端,這些虛擬終端是附加在物理終端之上的,用軟體方式虛擬實現的終端,CentOS 預設啟用 6 個虛擬終端,可以通過使用快捷鍵來切換進來,切換方式:Ctrl-Alt-F[1-6],表示為 /dev/tty#;
在實際的操作中,系統啟動之後我們都是通過虛擬終端1來登入,即便是在物理裝置上,(那麼什麼時候用物理終端呢?是在系統開機啟動的時候,服務還沒有全部起來,這個時候對映的是物理終端,在服務完全啟動之後對映的是虛擬終端1,當然還有圖形終端)。
(3)圖形終端:也是附加在物理終端之上,用軟體方式虛擬實現的終端,但額外會提供桌面環境。也是虛擬終端的一種切換方式:Ctrl-Alt-F7。
(4)偽終端(模擬終端):圖形介面下開啟的命令列介面,還有基於 ssh 協議或 telnet 協議等遠端開啟的命令列介面。表示為:/dev/pts/#,檢視當前的終端裝置命令:tty。
終端實際上是一個裝置,一個裝置要想與系統進行互動,必須有互動介面,當我們開啟一個終端時,系統會自動的在終端上執行(附加)一個互動式程式。
互動式程式有兩類:GUI 和 CLI。
GUI:圖形化介面,是基於 X 協議實現的視窗管理器(桌面、按鈕的作用等)。
Linux桌面系統有:
(1)GNOME:C 程式開發,gtk 開發庫;
(2)KDE:C++ 程式開發,qt 開發庫;
(3)XFCE:輕量級桌面;
CLI:命令列介面,對應的叫 shell 程式,使用者要想與系統互動,必須通過 shell,不同的程式設計師開發的程式不一樣,但是都可以實現同樣的功能(就是互動式功能),而且 shell 程式也有很多種,如:sh,csh,ksh,Bash,zsh。
如何獲取當前環境使用的 shell 是哪種 shell:# echo $SHELL,顯示當前系統使用的所有 shell:# cat /etc/shells

3、命令提示符

[[email protected] ~]#
[[email protected] ~] 我們稱之為 PS1,靠環境變數定義,其組成部分可以使用 echo 命令來顯示:echo $PS1,格式 [\[email protected]\h \W]$
 # 表示命令提示符,提示符有兩種:
(1)# 表示管理員登入;
(2)$ 表示普通使用者登入。
因此可以通過命令提示符來判斷是管理員登入還是普通使用者登入。
所謂命令提示符,就是提示我們可以在此輸入命令了,那麼輸入命令意味著什麼?
輸入命令,然後回車,提請 shell 程式找到鍵入的命令所對應的可執行程式或程式碼,並由其分析後提交給核心分配資源將其執行起來,表現為一個或多個程序。如:輸入 ls,先查詢 ls 對應的可執行程式:
 # which ls 可檢視 ls 命令對應的可執行程式(也可以使用 whereis ls)
 # whereis ls 也可以獲得 ls 有哪些幫助檔案
有些命令是找不到其對應的可執行程式的,如 cd。
在 shell 中可執行的命令有兩類:
(1)內建命令:由 shell 自帶的,而且通過某命令形式提供;
(2)外部命令:在當前系統的某檔案系統路徑下有對應的可執行程式檔案,可通過 which whereis 命令來查詢到其可執行程式檔案。
如何檢視一個命令是內建命令還是外部命令:
通過 type 命令,格式:type COMMAND(注意,Linux嚴格區分大小寫)。
執行命令:
命令格式:COMMAND [OPTIONS…][ARGUMENTS…]
選項:用於啟用或關閉命令的某個或某些功能,如:ls 的 -l -h 選項;
短選項:如-c,多個短選項可合併使用;
長選項:–word,如 --long等。
引數:命令的作用物件(就是向命令提供資料的),命令的引數可以有多個。
注意:多選項,以及多引數和命令之間都應該使用空白字元分隔;取消命令執行:Ctrl-c。

4、檔案系統

什麼是檔案系統?如查詢一個名叫 magedu 的檔案,怎麼去查詢?比如說系統只有一個 C 盤,首先要找到 C 盤,然後從 C 盤開始一層一層地查詢直到找到 magedu 檔案或者遍歷所有檔案,這個從最頂端開始一級一級地找到檔案這樣一種格式,稱之為檔案路徑。
查詢一個檔案,如果運氣好很快就能找到,否則可能就需要花費很長時間去查詢。我們必須給一個具體的起始位置,然後會按照給定的起始位置去查詢,如果給定的起始位置為根,我們稱之為絕對起始位置。這就是檔案系統的概念。
那麼反映到我們的檔案路徑上來說是這樣的:如 windows 上,C:\Program Files\office\word\word.exe,對 Linux 而言,/etc/sysconfig/network-scripts/ifcfg-eth0(最後一個節點叫做葉子節點,前面的稱之為分叉節點(目錄)),呈現倒狀樹型,所以查詢檔案就是從根開始一級一級找。
問:目錄是什麼?答:目錄並非資料夾,而是路徑對映。
問:檔案是什麼?答:首先檔案得必須有名字,檔案系統按名儲存,檔名與檔案內容沒有關係,檔名是檔案的外圍屬性,就比如人的名字一樣。所以檔案元資料就是由檔名、大小、屬性這些外圍屬性所組成的。
檔案有兩類資料:元資料:metadata,檔名、大小屬性等,如人的身高體重等;資料,data。比如書的檔案索引資訊就是元資料,而元資料所指向的那本書就相當於資料,目錄也是一種檔案,是一種特殊的檔案。
Linux 檔案系統的特性:
(1)檔名嚴格區分字元大小寫;
(2)檔名可使用除了 / 以外的任意字元,但不建議使用特殊字元;
(3)檔名長度最長不能超過 255 個字元;
(4)所有 . 開頭的檔案都為隱藏檔案;
繼續上面提到的路徑概念,路徑在作業系統上分為兩種:絕對路徑和相對路徑。絕對路徑:從根目錄起始的路徑;相對路徑:從當前位置起始的路徑。當前位置:當前所處的位置,也稱為工作目錄,登入系統之後無時無刻都處在某個位置,可通過命令 pwd 來顯示當前位置。
如何表示當前目錄:
(1)./ ./sysconfig/network-scripts;
(2)或者省略上述 sysconfig/network-scripts;
(3)…表示當前目錄的上一級目錄。
無論是哪個 Linux 發行版都是以根為起始位置的,根下面都有這些一級子目錄,並且這些目錄的名稱格式基本上都一樣,這些內容都是由 LSB 來統一定義的。
Linux命令幫助的獲取詳解
首先此前說過命令的一個使用語法,也就是格式為:
COMMAND [OPTIONS…] [ARGUMENTS…]
在獲取命令幫助資訊時,內部命令和外部命令的獲取方式是有區別的:
內部命令:help COMMAND
外部命令:有以下幾種途徑
(1)通過命令自帶的幫助資訊
COMMAND --help
COMMAND -h
(2)使用手冊(manual)
man COMMAND
(3)資訊頁
info COMMAND:支援資訊頁中的超連結
(4)程式自身的幫助文件,有README、INSTALL、Changelog等
(5)程式的官方文件
(6)發行版的官方文件
(7)Google
內部命令幫助
help COMMAND
當前shell為bash,如果想要檢視bash的幫助資訊,可以通過man bash來檢視,同時我們知道bash提供了很多個內部命令,如:cd、ls等,如果我們通過man cd來檢視幫助資訊會怎樣?實際上檢視到的是bash的幫助資訊,因此我們內部命令不通過man來檢視。
當我們執行一個命令的時候,系統會去找該命令的可執行檔案,那怎麼找呢,到哪裡找呢?
當鍵入一個命令回車之後,系統會去特定的目錄裡面查詢,這是一個專門的位置$PATH,先看下這個變數的值:# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
注意:查詢過程是有順序的,自左向右,直到查詢到為止,如果一個命令存在於多個路徑中,他只匹配到第一個找到的路徑,所以其先後次序是很關鍵的。
hash
hash的作用:hash就是記錄或顯示程式的位置(可執行程式的位置)。如果我們執行程式,系統每次都要從目錄裡面查詢可執行檔案,如果目錄裡面有很多可執行程式,那每次都需要花費很多時間去找檔案,這就勢必導致系統響應很慢,當然這也很不現實。實際中是隻有第一次才去完整查詢命令執行檔案的,然後將其查詢的結果記錄下來放置到快取中,如果下次還需要執行同樣的命令,那麼就直接從快取中找命令的執行檔案,然後直接執行。
這個快取就是一個key/value的儲存,可以通過hash命令來檢視這個命令的快取結果,這裡的value就是命令的可執行檔案的路徑,key是一段hash碼。
將一個命令移入到另一個目錄裡面來執行該命令,如:mv /bin/ls /usr/bin/ls,再執行ls命令,會發現系統找不到ls命令了。
hash的使用
通過內部命令獲取幫助資訊的方式來獲取hash命令的使用方法:help hash
-d 表示清空指定的命令的快取,如:hash -d ls
-r 表示清空所有命令的快取,hash -r
history命令
history是管理命令歷史,每次執行的命令都會放置在記憶體的快取當中,直到退出當前終端後會被儲存在命令歷史檔案當中。
檢視命令歷史:在家目錄下面ls -a,有個隱藏檔案.bash_history,可以通過檢視該檔案的內容來獲取歷史命令。
因此,命令的歷史有兩個存放位置:
(1)登入進shell後新執行的命令只會記錄在快取當中;
(2)登入shell時,會讀取命令歷史檔案中記錄的命令~/.bash_history;
history的使用選項:
-a:追加本次會話新執行的命令歷史列表至歷史檔案中;
-d:刪除歷史命令中指定的命令;
-c:清空命令歷史;
基於命令歷史做的快捷操作:
假如我們想執行命令歷史中的某條命令
(1)!n:執行命令歷史中第n條命令;
(2)!string:呼叫歷史中最近一個以string開頭的命令
(3)!!:重複執行上一條命令;
(4)還可通過上下鍵來選擇呼叫歷史命令;
外部命令幫助:
(1)COMMAND --help
(2)man COMMAND:man幫助文件手冊
手冊頁位置:/usr/share/man
man有8個章節:Man1–Man8
(3)Info命令的使用:info COMMAND
(4)程式自身的幫助文件:/usr/share/doc/command-version
(5)程式官方文件
(6)發行版官方文件
(7)Google
查詢命令所屬的章節:whatis COMMAND 或者 man -k COMMAND
man1:使用者命令章節,所有使用者都可以使用的;
man2:系統呼叫命令章節;
man3:C庫呼叫;
man4:裝置及特殊檔案;
man5:配置檔案的格式及相關引數;
man6:遊戲;
man7:雜項;
man8:管理命令;
試想一下man命令怎麼知道去哪裡找呢?
其實man有自己的配置檔案,會在配置檔案裡面定義man文件的路徑,配置檔案為:
CentOS 6:/etc/man.config;
CentOS 7:/etc/man_db.conf;
man -M /PATH/TO/SOMEWHERE COMMAND:到指定位置下搜尋手冊並顯示之。
Man手冊段落含義:
NAME:命令的名稱及簡要說明;
DESCRIPTION:命令功能的詳細描述;
OPTIONS:所支援的選項的相關說明;
SYSNOPSIS:使用格式;
EXAMPLES:使用示例;
NOTES:相關注意事項;
FILES:相關的配置檔案;
SEE ALSO:相關參考;
通過man命令獲得命令的幫助資訊頁當中有一些用符號標記的內容,這些符號的意義是:
[]:可選內容;
<>:必選內容;
|:二選一;
…:同類內容可以有多個;
man命令的操作方法:
翻屏:使用空格或者上下箭頭,或者PgUp、PgDn等來進行;
文字搜尋等。