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

什麼是shell

簡單點理解,就是系統跟計算機硬件交互時使用的中間介質,它只是系統的一個工具。實際上,在shell和計算機硬件之間還有一層東西那就是系統內核了。打個比方,若是把計算機硬件比做一我的的軀體,而系統內核則是人的大腦,至於shell,把它比做人的五官彷佛更加貼切些。回到計算機上來,用戶直接面對的不是計算機硬件而是shell,用戶把指令告訴shell,而後shell再傳輸給系統內核,接着內核再去支配計算機硬件去執行各類操做。html

Bash

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

  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有什麼特色呢?shell

  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. 按行讀取命令bash

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

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

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

$ 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:ui

  1. 學習 shell 腳本以前的基礎知識
  2. The Bash Parser
  3. Remove files with names containing strange characters such as spaces, semicolons, and backslashes in Unix
相關文章
相關標籤/搜索