Bash簡介 & Bash是如何處理命令的
什麼是shell
簡單點理解,就是系統跟計算機硬體互動時使用的中間介質,它只是系統的一個工具。實際上,在shell和計算機硬體之間還有一層東西那就是系統核心了。打個比方,如果把計算機硬體比作一個人的軀體,而系統核心則是人的大腦,至於shell,把它比作人的五官似乎更加貼切些。回到計算機上來,使用者直接面對的不是計算機硬體而是shell,使用者把指令告訴shell,然後shell再傳輸給系統核心,接著核心再去支配計算機硬體去執行各種操作。
Bash
Unix中有兩種主要的shell類別:
- Bourne shell − If you are using a Bourne-type shell,the $ character is the default prompt.
- 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有什麼特點呢?
- 記錄命令歷史 我們敲過的命令,linux是會有記錄的,預設可以記錄1000條歷史命令。這些命令儲存在使用者的家目錄中的.bash_history檔案中。
- 指令和檔名補全 按tab鍵,它可以幫你補全一個指令,也可以幫你補全一個路徑或者一個檔名。連續按兩次tab鍵,系統則會把所有的指令或者檔名都列出來。
- 別名 前面也出現過alias的介紹,這個就是bash所特有的功能之一了。我們可以通過alias把一個常用的並且很長的指令別名一個簡潔易記的指令。 4 . 萬用字元 在bash下,可以使用*來匹配零個或多個字元,而用?匹配一個字元。
- 輸入輸出從定向 輸入重定向用於改變命令的輸入,輸出重定向用於改變命令的輸出。輸出重定向更為常用,它經常用於將命令的結果輸入到檔案中,而不是螢幕上。輸入重定向的命令是<,輸出重定向的命令是>,另外還有錯誤重定向2>,以及追加重定向>>。
- 管道符 前面已經提過過管道符”|”,就是把前面的命令執行的結果丟給後面的命令。
- 作業控制。 當執行一個程式時,你可以使它暫停(按Ctrl+z),然後使用fg命令恢復它,利用bg命令使他到後臺執行,你也可以使它終止(按Ctrl+c)。
Bash如何解析命令
-
按行讀取命令
-
處理引用問題 雙引號內的字元將失去其原有意義,除了
$
,"
和\
。 單引號內的字元將失去其原有意義,包括$
,"
和\
。 -
將輸入的一行字串按照 ; 分割成多個命令。
-
處理特殊字元
{..},<(..),< ...,<<< ..,.. | ..
等特殊字元會被按照特殊的執行次序處理。 重定向符號會被從命令列中移除,所以在執行命令時... > log
,2>&1
這些命令都是不會提交給核心處理命令的程式的。 其他符號會被其對應的結果表達所替代,如{..}
命令:
$ echo {a..c}
a b c
複製程式碼
- 變數替換 將帶 $ 符號的變數 $parameter替換成變數內容, 術語叫Parameter Expansion.
$ echo $PWD
/z/ros
複製程式碼
- 將命令列分割成被執行命令和引數 分割的原則是任何空白(空格、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
複製程式碼
- 執行命令 a. 如果命令是 function or builtin,該命令將會被接收命令的同一個Bash process處理。 b. 否則 (像是 hadoop fs 等命令),Bash 將會 fork off,創造一個新的Bash子程式,將解析好的命令傳遞給它,並等待它返回結果。一般情況下,子程式將會繼承父程式的標準流。
Ref: