Shell(bash) 介绍
文章目錄
- Shell 介紹
- Shell 種類
- 命令行環境
- 終端模擬器
- 命令行提示符
- 進入和退出方法
- Shell 腳本
- 第一個shell腳本
- Bash
- Bash如何解析命令
- Shell 和 Bash 的歷史
Shell 介紹
簡單點理解,就是系統跟計算機硬件交互時使用的中間介質,它只是系統的一個工具。實際上,在shell和計算機硬件之間還有一層東西那就是系統內核了。打個比方,如果把計算機硬件比作一個人的軀體,而系統內核則是人的大腦,至于shell,把它比作人的五官似乎更加貼切些。回到計算機上來,用戶直接面對的不是計算機硬件而是shell,用戶把指令告訴shell,然后shell再傳輸給系統內核,接著內核再去支配計算機硬件去執行各種操作。
Shell 是一個用 C 語言編寫的程序,它是用戶使用 Linux 的橋梁。Shell 既是一種命令語言,又是一種程序設計語言。
Shell 是指一種應用程序,這個應用程序提供了一個界面,用戶通過這個界面訪問操作系統內核的服務。
Ken Thompson 的 sh 是第一種 Unix Shell,Windows Explorer 是一個典型的圖形界面 Shell。
Shell 編程跟 JavaScript、php 編程一樣,只要有一個能編寫代碼的文本編輯器和一個能解釋執行的腳本解釋器就可以了。
Shell 這個單詞的原意是“外殼”,跟 kernel(內核)相對應,比喻內核外面的一層,即用戶跟內核交互的對話界面。
具體來說,Shell 這個詞有多種含義。
首先,Shell 是一個程序,提供一個與用戶對話的環境。這個環境只有一個命令提示符,讓用戶從鍵盤輸入命令,所以又稱為命令行環境(command line interface,簡寫為 CLI)。Shell 接收到用戶輸入的命令,將命令送入操作系統執行,并將結果返回給用戶。本書中,除非特別指明,Shell 指的就是命令行環境。
其次,Shell 是一個命令解釋器,解釋用戶輸入的命令。它支持變量、條件判斷、循環操作等語法,所以用戶可以用 Shell 命令寫出各種小程序,又稱為腳本(script)。這些腳本都通過 Shell 的解釋執行,而不通過編譯。
最后,Shell 是一個工具箱,提供了各種小工具,供用戶方便地使用操作系統的功能。
Shell 種類
Linux Shell 有很多種,只要能給用戶提供命令行環境的程序,都可以看作是 Shell。
歷史上,主要的 Shell 有下面這些。
Bourne Shell(sh) 命令文件 /usr/bin/sh或/bin/sh
Bourne Again shell(bash)命令文件 /bin/bash
C Shell(csh)命令文件 /usr/bin/csh
TENEX C Shell(tcsh)
Korn shell(ksh)命令文件 /usr/bin/ksh
Z Shell(zsh)命令文件 /usr/bin/zsh
Friendly Interactive Shell(fish)
Shell for Root(/sbin/sh)
…
Bash 是目前最常用的 Shell,除非特別指明,下文的 Shell 和 Bash 當作同義詞使用,可以互換。
在一般情況下,人們并不區分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同樣也可以改為 #!/bin/bash。
#! 告訴系統其后路徑所指定的程序即是解釋此腳本文件的 Shell 程序。
下面的命令可以查看當前運行的 Shell:
$ echo $SHELL /bin/bash下面的命令可以查看當前的 Linux 系統安裝的所有 Shell。
$ cat /etc/shells上面兩個命令中,$ 是命令行環境的提示符,用戶只需要輸入提示符后面的內容。
Linux 允許每個用戶使用不同的 Shell,用戶的默認 Shell 一般都是 Bash,或者與 Bash 兼容。
命令行環境
終端模擬器
如果是不帶有圖形環境的 Linux 系統(比如專用于服務器的系統),啟動后就直接是命令行環境。
不過,現在大部分的 Linux 發行版,尤其是針對普通用戶的發行版,都是圖形環境。用戶登錄系統后,自動進入圖形環境,需要自己啟動終端模擬器,才能進入命令行環境。
所謂“終端模擬器”(terminal emulator)就是一個模擬命令行窗口的程序,讓用戶在一個窗口中使用命令行環境,并且提供各種附加功能,比如調整顏色、字體大小、行距等等。
不同 Linux 發行版(準確地說是不同的桌面環境)帶有的終端程序是不一樣的,比如 KDE 桌面環境的終端程序是 konsole,Gnome 桌面環境的終端程序是 gnome-terminal,用戶也可以安裝第三方的終端程序。所有終端程序,盡管名字不同,基本功能都是一樣的,就是讓用戶可以進入命令行環境,使用 Shell。
命令行提示符
進入命令行環境以后,用戶會看到 Shell 的提示符。提示符往往是一串前綴,最后以一個美元符號$結尾,用戶可以在這個符號后面輸入各種命令。
[user@hostname] $上面例子中,完整的提示符是[user@hostname] $,其中前綴是用戶名(user)加上@,再加主機名(hostname)。比如,用戶名是bill,主機名是home-machine,前綴就是bill@home-machine。
注意,根用戶(root)的提示符,不以美元符號($)結尾,而以井號(#)結尾,用來提醒用戶,現在具有根權限,可以執行各種操作,務必小心,不要出現誤操作。這個符號是可以自己定義的,詳見《命令提示符》一章。
為了簡潔,后文的命令行提示符都只使用$表示。
進入和退出方法
進入命令行環境以后,一般就已經打開 Bash 了。如果你的 Shell 不是 Bash,可以輸入bash命令啟動 Bash。
$ bash退出 Bash 環境,可以使用exit命令,也可以同時按下Ctrl + d。
$ exitBash 的基本用法就是在命令行輸入各種命令,非常直觀。作為練習,可以試著輸入pwd命令。按下回車鍵,就會顯示當前所在的目錄。
$ pwd /home/me如果不小心輸入了pwe,會返回一個提示,表示輸入出錯,沒有對應的可執行程序。
$ pwe bash: pwe:未找到命令Shell 腳本
Shell 腳本(shell script),是一種為 shell 編寫的腳本程序。
業界所說的 shell 通常都是指 shell 腳本,但讀者朋友要知道,shell 和 shell script 是兩個不同的概念。
第一個shell腳本
打開文本編輯器(可以使用 vi/vim 命令來創建文件),新建一個文件 test.sh,擴展名為 sh(sh代表shell),擴展名并不影響腳本執行,見名知意就好,如果你用 php 寫 shell 腳本,擴展名就用 php 好了。
輸入一些代碼,第一行一般是這樣:
#!/bin/bash echo "Hello World !"#! 是一個約定的標記,它告訴系統這個腳本需要什么解釋器來執行,即使用哪一種 Shell。
echo 命令用于向窗口輸出文本。
運行 Shell 腳本有兩種方法:
1、作為可執行程序
將上面的代碼保存為 test.sh,并 cd 到相應目錄:
chmod +x ./test.sh #使腳本具有執行權限 ./test.sh #執行腳本注意,一定要寫成 ./test.sh,而不是 test.sh,運行其它二進制的程序也一樣,直接寫 test.sh,linux 系統會去 PATH 里尋找有沒有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的當前目錄通常不在 PATH 里,所以寫成 test.sh 是會找不到命令的,要用 ./test.sh 告訴系統說,就在當前目錄找。
2、作為解釋器參數
這種運行方式是,直接運行解釋器,其參數就是 shell 腳本的文件名,如:
/bin/sh test.sh /bin/php test.php這種方式運行的腳本,不需要在第一行指定解釋器信息,寫了也沒用。
Bash
Bash 是一個為GNU項目編寫的Unix shell。它的名字是一系列縮寫:Bourne-Again SHell — 這是關于Bourne shell(sh)的一個雙關語(Bourne again / born again)。Bourne shell是一個早期的重要shell,由Stephen Bourne在1978年前后編寫,并同Version 7 Unix一起發布。bash則在1987年由Brian Fox創造。在1990年,Chet Ramey成為了主要的維護者。
bash是大多數Linux系統以及Mac OS X v10.4默認的shell,它能運行于大多數Unix風格的操作系統之上,甚至被移植到了Microsoft Windows上的Cygwin系統中,以實現windows的POSIX虛擬接口。此外,它也被DJGPP項目移植到了MS-DOS上。
bash的命令語法是Bourne shell命令語法的超集。數量龐大的Bourne shell腳本大多不經修改即可以在bash中執行,只有那些引用了Bourne特殊變量或使用了Bourne的內置命令的腳本才需要修改。 bash的命令語法很多來自Korn shell (ksh) 和 C shell (csh), 例如命令行編輯,命令歷史,目錄棧,$RANDOM 和 $PPID 變量,以及POSIX的命令置換語法: $(…)。作為一個交互式的shell,按下TAB鍵即可自動補全已部分輸入的程序名,文件名,變量名等等。
Bash 是 Unix 系統和 Linux 系統的一種 Shell(命令行環境),是目前絕大多數 Linux 發行版的默認 Shell。
Unix中有兩種主要的shell類別:
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把一個常用的并且很長的指令別名一個簡潔易記的指令。
在bash下,可以使用*來匹配零個或多個字符,而用?匹配一個字符。
輸入重定向用于改變命令的輸入,輸出重定向用于改變命令的輸出。輸出重定向更為常用,它經常用于將命令的結果輸入到文件中,而不是屏幕上。輸入重定向的命令是<,輸出重定向的命令是>,另外還有錯誤重定向2>,以及追加重定向>>。
前面已經提過過管道符”|”,就是把前面的命令運行的結果丟給后面的命令。
當運行一個進程時,你可以使它暫停(按Ctrl+z),然后使用fg命令恢復它,利用bg命令使他到后臺運行,你也可以使它終止(按Ctrl+c)。
Bash如何解析命令
按行讀取命令
處理引用問題
雙引號內的字符將失去其原有意義,除了$, "和\。
單引號內的字符將失去其原有意義,包括$, "和\。
將輸入的一行字符串按照 ; 分割成多個命令。
處理特殊字符
{..}, <(..), < ..., <<< .., .. | ..等特殊字符會被按照特殊的執行次序處理。
重定向符號會被從命令行中移除,所以在執行命令時... > log, 2>&1這些命令都是不會提交給內核處理命令的進程的。
其他符號會被其對應的結果表達所替代,如{..}命令:
將帶 $ 符號的變量 $parameter替換成變量內容, 術語叫Parameter Expansion.
分割的原則是任何空白(空格、Tab)都將作為分隔符將一整條命令分割成一個一個的詞。分割后結果的第一個詞作為命令,其他詞作為參數。如果命令詞中包含空白,需要用引號括起來。
Tips: 在從Windows或MacOS將文件復制到Linux時,有些文件的文件名可能包含Linux不支持的特殊字符,如空格,#等,如文件名file 1127.txt在Windows下是合法的,但是在Linux不合法,刪除這個文件的命令:
$ rm file 1127.txt // not work $ rm "file 1127.txt" // worka. 如果命令是 function or builtin,該命令將會被接收命令的同一個Bash process處理。
b. 否則 (像是 hadoop fs 等命令), Bash 將會 fork off,創造一個新的Bash子進程,將解析好的命令傳遞給它,并等待它返回結果。一般情況下,子進程將會繼承父進程的標準流。
Shell 和 Bash 的歷史
Shell 伴隨著 Unix 系統的誕生而誕生。
1969年,Ken Thompson 和 Dennis Ritchie 開發了第一版的 Unix。
1971年,Ken Thompson 編寫了最初的 Shell,稱為 Thompson shell,程序名是sh,方便用戶使用 Unix。
1973年至1975年間,John R. Mashey 擴展了最初的 Thompson shell,添加了編程功能,使得 Shell 成為一種編程語言。這個版本的 Shell 稱為 Mashey shell。
1976年,Stephen Bourne 結合 Mashey shell 的功能,重寫一個新的 Shell,稱為 Bourne shell。
1978年,加州大學伯克利分校的 Bill Joy 開發了 C shell,為 Shell 提供 C 語言的語法,程序名是csh。它是第一個真正替代sh的 UNIX shell,被合并到 Berkeley UNIX 的 2BSD 版本中。
1979年,UNIX 第七版發布,內置了 Bourne Shell,導致它成為 Unix 的默認 Shell。注意,Thompson shell、Mashey shell 和 Bourne shell 都是貝爾實驗室的產品,程序名都是sh。對于用戶來說,它們是同一個東西,只是底層代碼不同而已。
1983年,David Korn 開發了Korn shell,程序名是ksh。
1985年,Richard Stallman 成立了自由軟件基金會(FSF),由于 Shell 的版權屬于貝爾公司,所以他決定寫一個自由版權的、使用 GNU 許可證的 Shell 程序,避免 Unix 的版權爭議。
1988年,自由軟件基金會的第一個付薪程序員 Brian Fox 寫了一個 Shell,功能基本上是 Bourne shell 的克隆,叫做 Bourne-Again SHell,簡稱 Bash,程序名為bash,任何人都可以免費使用。后來,它逐漸成為 Linux 系統的標準 Shell。
1989年,Bash 發布1.0版。
1996年,Bash 發布2.0版。
2004年,Bash 發布3.0版。
2009年,Bash 發布4.0版。
2019年,Bash 發布5.0版。
用戶可以通過bash命令的--version參數或者環境變量$BASH_VERSION,查看本機的 Bash 版本。
$ bash --version GNU bash,版本 5.0.3(1)-release (x86_64-pc-linux-gnu)# 或者 $ echo $BASH_VERSION 5.0.3(1)-release參考來源:
學習 Shell 腳本之前的基礎知識
總結
以上是生活随笔為你收集整理的Shell(bash) 介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 洗衣服的步骤 洗衣服正确步骤介绍
- 下一篇: Servlet 处理多种请求应用