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