1. 程式人生 > 程式設計 >Bash簡介 & Bash是如何處理命令的

Bash簡介 & Bash是如何處理命令的

什麼是shell

簡單點理解,就是系統跟計算機硬體互動時使用的中間介質,它只是系統的一個工具。實際上,在shell和計算機硬體之間還有一層東西那就是系統核心了。打個比方,如果把計算機硬體比作一個人的軀體,而系統核心則是人的大腦,至於shell,把它比作人的五官似乎更加貼切些。回到計算機上來,使用者直接面對的不是計算機硬體而是shell,使用者把指令告訴shell,然後shell再傳輸給系統核心,接著核心再去支配計算機硬體去執行各種操作。

Bash

Unix中有兩種主要的shell類別:

  1. Bourne shell − If you are using a Bourne-type shell,the $ character is the default prompt.
  2. C shell − If you are using a C-type shell,the % character is the default prompt.

linux的釋出版本之一——Redhat/CentOS——系統預設安裝的shell叫做bash,即Bourne Again Shell,它是sh(Bourne Shell)的增強版本。Bourn Shell 是最早行起來的一個shell,創始人叫Steven Bourne,為了紀念他所以叫做Bourn Shell,檢稱sh。那麼這個bash有什麼特點呢?

  1. 記錄命令歷史 我們敲過的命令,linux是會有記錄的,預設可以記錄1000條歷史命令。這些命令儲存在使用者的家目錄中的.bash_history檔案中。
  2. 指令和檔名補全 按tab鍵,它可以幫你補全一個指令,也可以幫你補全一個路徑或者一個檔名。連續按兩次tab鍵,系統則會把所有的指令或者檔名都列出來。
  3. 別名 前面也出現過alias的介紹,這個就是bash所特有的功能之一了。我們可以通過alias把一個常用的並且很長的指令別名一個簡潔易記的指令。 4 . 萬用字元 在bash下,可以使用*來匹配零個或多個字元,而用?匹配一個字元。
  4. 輸入輸出從定向 輸入重定向用於改變命令的輸入,輸出重定向用於改變命令的輸出。輸出重定向更為常用,它經常用於將命令的結果輸入到檔案中,而不是螢幕上。輸入重定向的命令是<,輸出重定向的命令是>,另外還有錯誤重定向2>,以及追加重定向>>。
  5. 管道符 前面已經提過過管道符”|”,就是把前面的命令執行的結果丟給後面的命令。
  6. 作業控制。 當執行一個程式時,你可以使它暫停(按Ctrl+z),然後使用fg命令恢復它,利用bg命令使他到後臺執行,你也可以使它終止(按Ctrl+c)。

Bash如何解析命令

  1. 按行讀取命令

  2. 處理引用問題 雙引號內的字元將失去其原有意義,除了$,"\。 單引號內的字元將失去其原有意義,包括$,"\

  3. 將輸入的一行字串按照 ; 分割成多個命令。

  4. 處理特殊字元 {..},<(..),< ...,<<< ..,.. | ..等特殊字元會被按照特殊的執行次序處理。 重定向符號會被從命令列中移除,所以在執行命令時... > log,2>&1這些命令都是不會提交給核心處理命令的程式的。 其他符號會被其對應的結果表達所替代,如{..}命令:

$ echo {a..c}
a b c
複製程式碼
  1. 變數替換 將帶 $ 符號的變數 $parameter替換成變數內容, 術語叫Parameter Expansion.
$ echo $PWD
/z/ros
複製程式碼
  1. 將命令列分割成被執行命令和引數 分割的原則是任何空白(空格、Tab)都將作為分隔符將一整條命令分割成一個一個的詞。分割後結果的第一個詞作為命令,其他詞作為引數。如果命令詞中包含空白,需要用引號括起來。
$ My Command /foo/bar   ## This will execute the command named 'My' because it is the first word.
$ "My Command" /foo/bar ## This will execute the command named 'My Command' because the space inside the quotes has lost its special meaning allowing it to split words.
複製程式碼

Tips: 在從Windows或MacOS將檔案複製到Linux時,有些檔案的檔名可能包含Linux不支援的特殊字元,如空格,#等,如檔名file 1127.txt在Windows下是合法的,但是在Linux不合法,刪除這個檔案的命令:

$ rm file 1127.txt // not work 
$ rm "file 1127.txt"  // work
複製程式碼
  1. 執行命令 a. 如果命令是 function or builtin,該命令將會被接收命令的同一個Bash process處理。 b. 否則 (像是 hadoop fs 等命令),Bash 將會 fork off,創造一個新的Bash子程式,將解析好的命令傳遞給它,並等待它返回結果。一般情況下,子程式將會繼承父程式的標準流

Ref:

  1. 學習 shell 指令碼之前的基礎知識
  2. The Bash Parser
  3. Remove files with names containing strange characters such as spaces,semicolons,and backslashes in Unix