Linux運維實戰之2-2:bash的工作特性

這次博文我們主要來談談bash的工作特性哈。

主要內容:

  1. bash是一種shell解釋程序    

  2. bash工作特性之命令狀態返回值

  3. bash工作特性之命令行展開

  4. bash工作特性之命令補全

  5. bash工作特性之路徑補齊

  6. bash工作特性之命令引用

  7. bash工作特性之命令別名

  8. bash工作特性之文件名通配

  9. bash工作特性之命令hash


問題引入:Linux中,命令是如何被執行的呢?

Linux命令的執行必須依賴于Shell命令解釋器。Shell實際上是在Linux系統中運行的一種特殊程序,它位于操作系統內核與用戶之間,負責接受用戶輸入的命令并進行解釋,將需要執行的操作傳遞給系統內核執行,Shell在用戶和內核之間充當了一個“翻譯官”的角色。當用戶登陸到Linux系統時,會自動加載一個Shell程序,以便給用戶提供可以輸入命令的操作環境,如下圖所示:

blob.png

一、bash一種shell解釋程序:

Bash是Linux系統中默認使用的Shell程序,文件位于/bin/bash。Linux系統中的shell程序有多種,可以通過/etc/shells文本文件查看:

blob.png

如何得知當前Linux系統默認使用的shell是哪一個呢?,可以查看環境變量SHELL的值哈。

blob.png

根據Linux命令與Shell程序的關系,一般分為以下兩種類型: 

  • 內部命令:指的是集成于Shell解釋器程序(如Bash)內部的一些特殊指令,也成為內建(Built-IN)指令。內部命令屬于Shell的一部分,所以并沒有單獨對應的系統文件,只要Shell解釋器被運行,內部指令也就自動載入內存了,用戶可以直接使用。內部命令無需從硬盤中重新讀取文件,因此執行效率更高。 

  • 外部命令:指的是Linux系統中能夠完成特定功能的腳本文件或二進制程序,每個外部命令對應了系統中的一個文件,是屬于Shell解釋器程序之外的命令,所以稱為外部命令。Linux系統必須知道外部命令對應的文件位置,才能夠由Shell加載并執行。 

Linux系統默認會將存放外部命令、程序的目錄(如/bin、/usr/bin、/usr/local/bin等)添加到用戶的“搜索路徑(PATH環境變量)”中,當使用位于這些目錄中的外部命令時,用戶不需要指定具體的位置,如下圖所示:blob.png

說明:多個路徑以:分割,放在左邊的路徑最先被搜索。 

bash作為一個解釋程序,有許多工作特性,歸納起來最主要的特性如下圖所示:

blob.png


二、bash的工作特性之1:命令狀態返回值

問題引入:在Linux中,如何得知命令執行成功或失敗了呢?

也許大家會說是看輸出結果,在Linux中沒有返回信息就是最好的信息,意思就是命令執行成功后在屏幕上不會顯示任何反饋信息。例如:

blob.png

如果命令執行錯誤一般會在屏幕上顯示相應的報錯信息,例如:

blob.png

問題拓展:但像ls、cat這樣的命令執行結果到底是成功還是失敗如何判斷呢?還有在非交互模式下,命令執行成功與否如何得知呢?

靠命令狀態返回值$?–它是Linux的一個特殊變量,其值為0或非0;為0表示命令執行成功,非0表示命令執行失敗。例如:

blob.png


三、bash的工作特性之2:命令行展開

實現下面的功能:

  1. 創建/tmp目錄下的a_c,a_d,b_c,b_d;

  2. 創建/tmp/mylinux目錄下的:

blob.png

實現過程:

(1)一般的做法是什么?肯定是這樣:

mkdir -pv /tmp/a_c
mkdir -pv /tmp/a_d
mkdir -pv /tmp/b_c
mkdir -pv /tmp/b_d

但這樣mkdir命令要敲4遍,冗余操作太多了哈??梢岳胋ash的特性–命令行展開來簡化操作,如下圖所示:

blob.png

(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}}

命令執行結果:

blob.png


四、bash工作特性之3:命令補全

bash支持命令補全,用戶不必輸入完整的命令,這樣可以避免輸入錯誤提高效率。

命令的部分字符<tab>
    會搜索PATH環境變量所指定的路徑下的所有可執行文件,如果“命令的部分字符”能惟一表示某命令,則直接補全為那個命令;
    如果不能惟一標示,則再敲一次tab鍵,會顯示所有以“命令的部分字符”開頭的命令;

范例:例如要在命令行下面鍵入“mkdir”命令,不用敲完整,敲入部分字符按tab鍵就可以

blob.png

可以看出,鍵入的命令越趨于完整,補全給出的命令選項就越少哈。

那么我們不禁要問,bash為什么會支持命令補全呢?它是如何搜索命令的呢?

通過環境變量$PATH的值作為搜索標準,如下圖所示:

blob.png

以敲ls命令為例,bash會先搜索/usr/lib64/qt-3.3/bin如果找到了就在屏幕顯示出來,如果沒找到就接著搜索/usr/local/sbin,直到最后,找到就顯示在屏幕上,沒找到就報錯

Linux中有很多環境變量,這些環境變量定義了用戶的使用環境,用2個命令可以查看:

export
printenv

blob.png


五、bash工作特性之4:路徑補齊

路徑補齊的特性與命令補全的特性類似,支持用<tab>鍵補齊文件路徑

blob.png

小結:

  • 在打命令和目錄的時候,我們一定要用TAB鍵來補全,這樣比較輕松,也能檢查命令是否正確。如果不能補全就證明我們敲入的命令有問題

  • 用命令補全,TAB,他會自動加上最后那個/符號,證明這是個目錄,如果后面沒有/的話,這個可能是目錄,也可能是文件


六、bash工作特性之5:命令引用

如何在命令中引用另一個命令的執行結果?(要注意是執行結果,而不是執行狀態)

命令引用:
`命令`或$(命令)

例如:

blob.png

此時,$mylinux變量的值為/tmp/mylinux/下的內容


七、bash工作特性之6:命令別名

如何定義一個命令的別名?

命令別名:
定義別名:alias 別名='正常命令'
撤銷別名:unalias 別名

使用注意事項:

別名的作用范圍是當前shell進程;要想永久生效,需要定義在配置文件中;

當別名跟命令的名字相同時,如果使用原有的命令而非別名,則使用“\命令”

例如:

blob.png

blob.png


八、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]

練習:

blob.png

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:清空緩存

例如:

blob.png


本次博文就這么多哈,歡迎各位大大指正!~~

原創文章,作者:N4_jjx,如若轉載,請注明出處:http://www.www58058.com/57877

(0)
N4_jjxN4_jjx
上一篇 2016-11-06
下一篇 2016-11-06

相關推薦

  • 馬哥教育網絡班21期-第7周課程練習

    第7周課程練習 創建一個10G分區,并格式為ext4文件系統; 添加一塊硬盤sdb 要求其block大小為2048,       預留空間百分比為2, 卷標為MYDATA, 默認掛載屬性包含acl; # mke2fs -t ext4 -b 2048 -L 'MYDATA' -m 2 # mount -o ac…

    Linux干貨 2016-10-09
  • 集中練習4-bash腳本、計劃任務

    集中練習4-bash腳本、計劃任務

    Linux干貨 2017-10-27
  • btrfs初步應用

    前言 一種技術要知其然,還要知其所以然。 Btrfs文件系統 Btrfs(B-tree文件系統,通常念成Butter FS,Better FS或B-tree FS),一種支持寫入時復制(COW)的文件系統,運行在Linux操作系統,采用GPL授權。Oracle于2007年對外宣布這項計劃,并發布源代碼,在2014年8月發布穩定版目標是替換Linux目前的ex…

    Linux干貨 2016-05-22
  • shell腳本之變量、運算、條件測試。

    概述 程序:指令+數據 程序編程風格: 過程式:以指令為中心,數據服務于指令 對象式:以數據為中心,指令服務于數據 shell程序:提供了編程能力,解釋執行 計算機:運行二進制指令; 編程語言: 低級:             匯編 高級:…

    Linux干貨 2016-08-15
  • Linux文本處理工具grep

    文件查看工具:cat     將[文件]或標準輸入組合輸出到標準輸出。               -A, –show-all       &nbs…

    Linux干貨 2016-08-10
  • N22-第九周作業

    第九周    1、寫一個腳本,判斷當前系統上所有用戶的shell是否為可登錄shell(即用戶的shell不是/sbin/nologin);分別這兩類用戶的個數;通過字符串比較來實現;    #!/bin/bash    #    decl…

    Linux干貨 2016-10-24

評論列表(2條)

  • 馬哥教育
    馬哥教育 2016-11-10 20:25

    總結的比較詳細,能注意下排版會更好~加油~

  • N25_Nva
    N25_Nva 2016-11-10 22:55

    受教,hash那邊再詳細些就好了

欧美性久久久久