硬件、內核與shell
我們必須要通過“shell”將我們輸入的命令與內核通信,好讓內核可以控制硬件來正確無誤地工作。
操作系統其實是一組軟件,由於這組軟件在控制整個硬件與管理系統的活動監測,如果這組軟件隨意被用戶操作,若用戶應用不當,將會使整個系統崩潰。
只要能夠操作應用程序的接口都能夠稱爲shell。狹義的shell指的是命令行方面的軟件。廣義的shell則包括圖形界面的軟件。
shell的好處:
- 命令行界面的shell,大家都一樣
- 遠程管理:命令行界面就是比較快
- 管理系統的關鍵
系統的合法shell與/etc/shells功能
目前的Linux可以使用的shell(/etc/shells文件):
- /bin/bash(Bourne Again SHell,Linux默認的shell)
- /bin/ksh(Kornshell由AT&T Bell lab發展出來,兼容於bash)
- /bin/tcsh(整合C shell,提供更多的功能)
- /bin/zsh(基於ksh發展出來,功能更強大)
用戶何時取得shell工作以及用戶默認的shell記錄在/etc/passwd文件內
bash shell的功能
- 命令記憶能力(history)
- 命令與文件補全功能(【Tab】按鍵的好處)
- 命令別名設置功能(alias)
- 作業控制、前臺、後臺控制(job control, foreground, background)
- 程序腳本(shell script)
- 通配符(Wildcard)
bash shell的內置命令:type
瞭解命令是來自於外部命令(指的是其他非bash所提供的命令)或是內置在bash當中
type [-tpa] name
參數:
type:不加任何參數時,type會顯示出name是外部命令還是bash內置命令
-t:type將name以下面這些字眼顯示出它的意義:
file:表示位外部命令
alias:表示該命令爲命令別名所設置的名稱
builtin:表示內置命令
-p:如果後面接的name爲外部命令時,纔會顯示完整文件名
-a:會有PATH變量定義的路徑中,將所有含name的命令都列出來,包含alias
命令的執行
反斜槓(\)轉移字符
shell的變量功能
- 變量的可變性與方便性
- 影響bash環境操作的變量:PATH變量
- 在進入shell之前,由於系統需要一些變量來提供他數據的訪問(或者是一些環境的設置參數值,例如是否要顯示彩色等的),所以就有一些所謂的“環境變量”需要來讀入系統。爲了區別與自定義變量的不同,環境變量通常以大寫字符來表示
- 腳本程序設計(shell script)的好幫手
變量的顯示與設置:echo,unset
變量的顯示echo
只需要在變量名稱前面加上$,或者是以${變量}的方式來顯示都可以。
設置或者修改變量的內容:用“等號(=)”連接變量與它的內容
在bash中,當一個變量名稱尚未被設置時,默認的內容是“空”的。
變量的設置規則:
- 變量與變量以一個等號“=”來連接
- 等號兩邊不能直接接空格符
- 變量名稱只能是英文字母與數字但是開頭字符不能是數字
- 變量內容若有空格符可使用雙引號或單引號將變量內容結合起來,但是雙引號類的特殊字符如$等,可以保留原本特性;單引號類的特殊字符則僅爲一般字符(純文本)
- 可用轉義字符“\”將特殊符號變成一般字符
- 在遺傳命令中,還需要通過其他的命令提供的信息,可以使用反單引號“`命令`”或“$(命令)”。
- 若該變量爲了增加變量內容時,則可使用“$變量名稱”或${變量}累加內容
- 若該變量需要在其他子進程中執行,則需要以export來使變量變成環境變量
- 通常大寫字符爲系統默認變量,自行設置變量可以使用小寫字符方便判斷
- 取消變量的方法爲使用“unset 變量名稱”
子進程:在目前這兒shell的情況下,其打開另一個新的shell,新的shell就是子進程。在一般狀態下,父進程的自定義變量是無法在子進程內是使用的。但通過export將變量編程環境變量以後,就能夠在子進程下面使用了。
環境變量的功能
用env(environment)查看環境變量與常見環境變量說明
HOSTNAME:這臺主機的主機名
TERM=這個終端機使用的環境是什麼類型
SHELL=目前這個環境下使用的shell是哪一個程序
HISTSIZE=記錄命令的條數,在CentOS中默認可記錄1000筆
USER=用戶的名稱
LS_COLORS=一些顏色顯示
MAIL=和這個用戶取用的mailbox位置
PATH:執行文件命令查找路徑
INOUTERC=與鍵盤功能有關,可以設置特殊按鍵
PWD=目前用戶所在的工作目錄
LANG=這個與語系相關
HOME=這個用戶的主文件夾
_=上一次使用的命令的最後一個參數(或命令本身)
RANDOM:“隨機數”變量,內容介於0~32767之間
用set查看所有變量(含環境變量與自定義變量)
HISTFILE=歷史命令記錄的放置文件,隱藏文件
MAILCHECK=每60秒去掃描一次信箱有無新信
PS1=命令提示符的設置值
PS2=使用轉義符號第二行以後的提示符
$目前這個shell所使用的PID
?剛纔執行完命令的回傳碼
一般來說,不論是否爲環境變量,只要跟目前這個shell的接口操作有關的變量,通常都會被設置爲大寫字符,也就是說,基本上,在Linux默認的情況中,使用{大寫字符}來設置的變量一般爲系統內定需要的變量。
PS1(提示符的設置)
$(關於本shell的PID)
?(關於上個執行命令的回傳碼)
一般來說,如果成功執行命令,則會回傳一個0值,如果執行過程中發生錯誤,就會回傳“錯誤代碼”,一般就是以非0的數值來替代
export:自定義變量轉成環境變量
環境變量與自定義變量的差異:該變量是否會被子進程所繼續使用
子進程僅會繼承父進程的環境變量,子進程不會繼承父進程的自定義變量
影響顯示結果的語系變量(locale)
locale
變量的有效範圍
環境變量可以被子進程所引用,但是其他的自定義變量內容就不會存在於子進程中
- 當啓動一個shell,操作系統會分配一個記憶塊給shell使用,此內存類的變量可讓子進程取用
- 若在父進程利用一個export功能,可以讓自定義變量的內容寫到上述記憶塊當中(環境變量)
- 當加載另一個shell時,子shell可以將父shell的環境變量所在的記憶塊導入到自己的環境變量塊當中
變量鍵盤的讀取、數組與聲明:read,array,declare
read:讀取來自鍵盤輸入的變量
參數:
-p:接提示信息
-t:接等待的“秒數”
declare/typeset:聲明變量類型
參數:
-a:數組類型
-i:整型
-x:環境變量
-r:readonly類型,該變量不可被更改內容,也不能重設
在默認的情況下,bash對於變量有幾個基本的定義:
- 變量類型默認爲“字符串”
- bash環境中的數值運算,默認最多僅能達到整數類型
與文件系統及程序的限制關係:ulimit
ulimit [-SHacdfltu] [配額]
參數:
-H:hard limit,嚴格的設置,必定不能超過這個設置的數值
-S:soft limit,警告的設置,可以超過這個數值,但是若超過則有警告信息
-a:列出所有的限制額度
-c:當某些進程發生錯誤時,系統會將該進程在內存中的信息寫成文件(排錯用),這種文件就被稱爲內核文件(core file),此爲限制每個內核文件的最大容量
-f:此shell可以創建的最大文件容量(一般爲2GB)單位爲KB
-d:進程可使用的最大斷裂內存(segment)容量
-l:用於鎖定(lock)的內存量
-t:可使用的最大CPU時間
-u:單一用戶可以使用的最大進程(process)數量
變量內容的刪除、替代與替換
命令別名設置:alias,unalias
歷史命令:history 【n】
history 【-c】
history 【-raw】 histfiles
參數:
n:數字,是要列出最近的n條命令行
-c:將目前的shell所有的history內容全部消除
-a:將目前新增的history命令新增入histfiles中,若沒有加histfiles,則默認寫入~/.bash_history
-r:將histfiles的內容讀到目前這個shell的history記憶中
-w:將目前的history記憶內容寫入histfiles中(默認爲~/.bash_history)
歷史命令在註銷時,會將最近的HISTSIZE條記錄到記錄文件當中
!number:執行第幾條命令
!command:有最近的命令向前搜尋命令串開頭爲command的那個命令,並執行
!!:執行上一個命令
Bash Shell的操作環境
路徑與命令查找的順序:
- 以相對/絕對路徑執行命令
- 由alias找到該命令執行
- 由bash內置的(builtin)命令來執行
- 通過$PATH這個變量的順序找到的第一個命令來執行
bash的登陸與歡迎信息:/etc/issue,/etc/motd
bash的環境配置文件
login與no-login shell
login shell:取得bash時需要完整的登陸流程,讀取/etc/profile(系統整體設置),~/.bash_profile或~/.bash_login或~/.profile(屬於用戶個人設置)
no-login shell:取得bash接口的方法不需要重複登錄的舉動,讀取~/.bashrc
source讀入環境配置文件
其他相關配置文件
/etc/man.config:規定了使用man的時候man page的路徑到那裏去尋找
~/.bash_history:歷史命令記錄
~/.bash_logout:記錄註銷bash後系統完成的操作
終端機環境設置:stty,set
通配符與特殊符號
數據流重定向
執行一個命令的時候,這個命令可能會由文件讀入數據,再將數據輸出到屏幕上。
standard output:標準輸出,命令執行所回傳的正確信息
standard error output:標準錯誤輸出,命令執行失敗後,所回傳的錯誤信息
數據流重定向可以將standard output(簡稱stdout)與standard error output(簡稱stderr)分別傳送到其他的文件或設備去,分別傳送所用的特殊字符如下:
- 標準輸入(stdin):代碼爲0,使用<或<<;
- 標準輸出(stdout):代碼爲1,使用>或>>;
- 標準錯誤輸出(stderr):代碼爲2,使用2>或2>>;
1>:以覆蓋的方法將正確的數據輸出到指定的文件或設備上
1>>:以累加的方法將正確的數據輸出到制定的文件或設備上
/dev/null垃圾桶黑洞設備與特殊寫法
如果知道錯誤將要發生,將錯誤信息忽略掉而不顯示或存儲
將錯誤和正確的數據通通寫入一個文件:2>&1也可以是&>
standard input:<與<<
將原本需要由鍵盤輸入的數據改由文件內容替代
<<代表結束輸入的意思
使用命令輸出重定向的原因:
- 屏幕輸出的信息很重要,而且需要將它存下來
- 後臺執行中的程序,並不希望它干擾屏幕正常的輸出結果
- 一些系統的例行命令的執行結果,希望它可以存下來時
- 一些執行命令的可能已知錯誤信息時,想以“2>/dev/null”將它丟掉時
- 錯誤信息與正確信息需要分別輸出時
命令執行的判斷依據:
cmd;cmd(不考慮命令相關性的連續命令執行)
$? (命令回傳碼)與&&或||
cmd1 && cmd2:若cmd1執行完畢且正確執行($?=0),則開始執行cmd2
cmd1 || cmd2:若cmd1執行完畢且正確執行($?=0),則cmd2不執行
一般來書,假設判斷式有三個:cmd1 && cmd2 || cmd3,cmd2和cmd3會放置肯定可以執行成功的命令
管道命令(pipe)
管道命令“|”僅能處理經由前面一個命令傳來的正確信息,也就是standard output的信息,對於standard error output並沒有直接的處理能力。
在每個管道後面接的第一個數據必定是“命令”,而且這個命令必須要能接受standard input的數據才行
選取命令:
cut:將一段信息的某一段“切”出來,處理的信息是以“行”爲單位
cut –d ‘分隔字符’ –f fields(取出第幾段)
cut –c 字符範圍(以字符的單位去除固定字符區間)
grep:分析一行信息,若當中有需要的信息,就將該行拿出來
grep [-acinv] [—color=auto] ‘查找字符串’filename
參數:
-a:將binary文件以text文件的方式查找數據
-c:計算找到‘查找字符串’的次數
-i:忽略大小寫
-n:輸出行號
-v:反向選擇,即顯示沒有‘查找字符串’內容的哪一行
--color=auto:將找到的關鍵字部分加上顏色顯示
排序命令:
sort:排序命令,依據不同的數據類型排序
uniq:將重複的數據僅列出一個顯示
wc:文件裏面的字數,行數和字符數
雙重定向:tee
同時將數據流送與文件與屏幕(screen);而輸出到標準屏幕的,其實就是stdout,可以讓下個命令繼續處理
tee –a file:以累加的方式,將數據加入file中
字符轉換命令:
tr:刪除一段信息當中的文字,或者是進行文字信息的轉換
tr [-ds] set1
參數;
-d:刪除信息當中的set1這個字符串
-s:替換掉重複的字符
col [-xb]
參數:
-x:將tab鍵換成對等的空格鍵
-b:在文字內有反斜槓(/)
col經常被利用於將man page轉存爲純文本文件以方便查閱的功能
join,將兩個文件當中有相同數據的那一行加在一起
join [-ti12] file1 file2
參數:
-t:join默認以空格符分隔數據,並且對比“第一個字段”的數據
-i:忽略大小寫
-1:代表第一個文件要用哪個字段來分析
-2:代表第二個文件要用哪個字段來分析