這次博文我們主要來談談bash的工作特性哈。
主要內容:
-
bash是一種shell解釋程序
-
bash工作特性之命令狀態返回值
-
bash工作特性之命令行展開
-
bash工作特性之命令補全
-
bash工作特性之路徑補齊
-
bash工作特性之命令引用
-
bash工作特性之命令別名
-
bash工作特性之文件名通配
-
bash工作特性之命令hash
問題引入:Linux中,命令是如何被執行的呢?
Linux命令的執行必須依賴于Shell命令解釋器。Shell實際上是在Linux系統中運行的一種特殊程序,它位于操作系統內核與用戶之間,負責接受用戶輸入的命令并進行解釋,將需要執行的操作傳遞給系統內核執行,Shell在用戶和內核之間充當了一個“翻譯官”的角色。當用戶登陸到Linux系統時,會自動加載一個Shell程序,以便給用戶提供可以輸入命令的操作環境,如下圖所示:
一、bash一種shell解釋程序:
Bash是Linux系統中默認使用的Shell程序,文件位于/bin/bash。Linux系統中的shell程序有多種,可以通過/etc/shells文本文件查看:
如何得知當前Linux系統默認使用的shell是哪一個呢?,可以查看環境變量SHELL的值哈。
根據Linux命令與Shell程序的關系,一般分為以下兩種類型:
-
內部命令:指的是集成于Shell解釋器程序(如Bash)內部的一些特殊指令,也成為內建(Built-IN)指令。內部命令屬于Shell的一部分,所以并沒有單獨對應的系統文件,只要Shell解釋器被運行,內部指令也就自動載入內存了,用戶可以直接使用。內部命令無需從硬盤中重新讀取文件,因此執行效率更高。
-
外部命令:指的是Linux系統中能夠完成特定功能的腳本文件或二進制程序,每個外部命令對應了系統中的一個文件,是屬于Shell解釋器程序之外的命令,所以稱為外部命令。Linux系統必須知道外部命令對應的文件位置,才能夠由Shell加載并執行。
Linux系統默認會將存放外部命令、程序的目錄(如/bin、/usr/bin、/usr/local/bin等)添加到用戶的“搜索路徑(PATH環境變量)”中,當使用位于這些目錄中的外部命令時,用戶不需要指定具體的位置,如下圖所示:
說明:多個路徑以:分割,放在左邊的路徑最先被搜索。
bash作為一個解釋程序,有許多工作特性,歸納起來最主要的特性如下圖所示:
二、bash的工作特性之1:命令狀態返回值
問題引入:在Linux中,如何得知命令執行成功或失敗了呢?
也許大家會說是看輸出結果,在Linux中沒有返回信息就是最好的信息,意思就是命令執行成功后在屏幕上不會顯示任何反饋信息。例如:
如果命令執行錯誤一般會在屏幕上顯示相應的報錯信息,例如:
問題拓展:但像ls、cat這樣的命令執行結果到底是成功還是失敗如何判斷呢?還有在非交互模式下,命令執行成功與否如何得知呢?
靠命令狀態返回值$?–它是Linux的一個特殊變量,其值為0或非0;為0表示命令執行成功,非0表示命令執行失敗。例如:
三、bash的工作特性之2:命令行展開
實現下面的功能:
-
創建/tmp目錄下的a_c,a_d,b_c,b_d;
-
創建/tmp/mylinux目錄下的:
實現過程:
(1)一般的做法是什么?肯定是這樣:
mkdir -pv /tmp/a_c mkdir -pv /tmp/a_d mkdir -pv /tmp/b_c mkdir -pv /tmp/b_d
但這樣mkdir命令要敲4遍,冗余操作太多了哈??梢岳胋ash的特性–命令行展開來簡化操作,如下圖所示:
(2)我們用命令行展開功能來創建題目中列出的Linux目錄結構:
mkdir -pv /tmp/mylinux/{bin,boot/grub,dev,etc/{rc.d/init.d,sysconfig/network-scripts}, lib/modules,lib64,proc,sbin,sys,tmp,usr/local/{bin,sbin},var/{lock,log,run}}
命令執行結果:
四、bash工作特性之3:命令補全
bash支持命令補全,用戶不必輸入完整的命令,這樣可以避免輸入錯誤提高效率。
命令的部分字符<tab> 會搜索PATH環境變量所指定的路徑下的所有可執行文件,如果“命令的部分字符”能惟一表示某命令,則直接補全為那個命令; 如果不能惟一標示,則再敲一次tab鍵,會顯示所有以“命令的部分字符”開頭的命令;
范例:例如要在命令行下面鍵入“mkdir”命令,不用敲完整,敲入部分字符按tab鍵就可以
可以看出,鍵入的命令越趨于完整,補全給出的命令選項就越少哈。
那么我們不禁要問,bash為什么會支持命令補全呢?它是如何搜索命令的呢?
通過環境變量$PATH的值作為搜索標準,如下圖所示:
以敲ls命令為例,bash會先搜索/usr/lib64/qt-3.3/bin如果找到了就在屏幕顯示出來,如果沒找到就接著搜索/usr/local/sbin,直到最后,找到就顯示在屏幕上,沒找到就報錯
Linux中有很多環境變量,這些環境變量定義了用戶的使用環境,用2個命令可以查看:
export printenv
五、bash工作特性之4:路徑補齊
路徑補齊的特性與命令補全的特性類似,支持用<tab>鍵補齊文件路徑
小結:
-
在打命令和目錄的時候,我們一定要用TAB鍵來補全,這樣比較輕松,也能檢查命令是否正確。如果不能補全就證明我們敲入的命令有問題
-
用命令補全,TAB,他會自動加上最后那個/符號,證明這是個目錄,如果后面沒有/的話,這個可能是目錄,也可能是文件
六、bash工作特性之5:命令引用
如何在命令中引用另一個命令的執行結果?(要注意是執行結果,而不是執行狀態)
命令引用: `命令`或$(命令)
例如:
此時,$mylinux變量的值為/tmp/mylinux/下的內容
七、bash工作特性之6:命令別名
如何定義一個命令的別名?
命令別名: 定義別名:alias 別名='正常命令' 撤銷別名:unalias 別名
使用注意事項:
別名的作用范圍是當前shell進程;要想永久生效,需要定義在配置文件中;
當別名跟命令的名字相同時,如果使用原有的命令而非別名,則使用“\命令”
例如:
八、bash工作特性之7:文件名通配
globbing:文件名通配機制
匹配模式:元字符
bash支持的文件通配符: *:表示任意長度的任意字符; ?:表示任意單個字符 []:指定范圍內的任意單個字符: [a-z]:所有的小寫字母 [A-Z]:所有的大寫字母 [0-9a-zA-Z]:所有的數字和字母 字符集合: [:digit:]:所有數字,相當于0-9 如:[[:digit:]] [:lower:]:所有小寫字母 [:upper:]:所有大寫字母 [:alpha:]:所有的字母 [:alnum:]:相當于[0-9a-zA-Z] [:space:]:空白字符 [:punct:]:所有標點符號 [^]:脫字符,取反,指定范圍外的任意單個字符,如:[^0-9]
練習:
1、~]# ls -d /var/l?[[:lower:]] 2、~]# ls -d /etc/[0-9]*[^0-9] 3、~]# ls -d /etc/[^[:alpha:]][[:alpha:]]* 或 ls -d /etc/[^a-z][a-z]* 4、~]# mkdir -p /tmp/magedu.com; cp -r /etc/m*[^0-9] /tmp/magedu.com/ 5、~]# mkdir /tmp/man; cp -r /usr/share/man/man*[0-9] /tmp/man/ 6、~]# mkdir /tmp/conf.d; cp -r /etc/{m,n,r,p}*.conf /tmp/conf.d 或 cp -r /etc/[mnrp]*.conf /tmp/conf.d
九、bash工作特性之8:命令hash
bash為了加速命令查找,緩存此前命令的查找結果:哈希碼(Key-value)存儲
key:搜索鍵
value:值
hash命令的用法: hash:列出緩存的命令 hash -d COMMAND:刪除指定的緩存命令 hash -r:清空緩存
例如:
本次博文就這么多哈,歡迎各位大大指正!~~
原創文章,作者:N4_jjx,如若轉載,請注明出處:http://www.www58058.com/57877
總結的比較詳細,能注意下排版會更好~加油~
受教,hash那邊再詳細些就好了