shell計(jì)算機(jī)殼層
Shell是操作系統(tǒng)的外殼,負(fù)責(zé)接收用戶輸入的命令并傳遞給操作系統(tǒng)內(nèi)核執(zhí)行。它是交互式的和跨平臺(tái)的,并具有腳本、管道和重定向、命令解析等功能。它允許用戶與計(jì)算機(jī)系統(tǒng)交互并執(zhí)行各種操作,如啟動(dòng)程序、管理文件和目錄等。
在shell語言的發(fā)展歷史上,最早的Thompson Shell是由Ken Ken Thompson創(chuàng)立的,后來的Bourne Shell和C Shell引入了現(xiàn)代Shell的更多特性和功能,成為Unix系統(tǒng)的標(biāo)準(zhǔn)Shell。常見的shell包括Bash、Zsh和Fish,它們廣泛應(yīng)用于不同的操作系統(tǒng)。
目前,計(jì)算機(jī)用戶界面主要分為兩種類型:命令行界面(CLI)和圖形用戶界面(GUI)。CLI是通過命令行輸入文本命令與計(jì)算機(jī)進(jìn)行交互的界面,通常用于服務(wù)器管理、系統(tǒng)維護(hù)、腳本編寫和批處理操作。GUI通過圖形元素和鼠標(biāo)操作進(jìn)行交互,并通過插件或擴(kuò)展進(jìn)行定制以滿足用戶的特定需求。隨著其不斷演進(jìn),shell語言在計(jì)算領(lǐng)域的影響力逐漸擴(kuò)大,為用戶提供了與操作系統(tǒng)高效交互的能力。
發(fā)展歷史
shell語言的起源
1971年,Ken Thompson為UNIX創(chuàng)建了第一個(gè)shell-V6 shell。這個(gè)shell位于/bin/sh中,是一個(gè)獨(dú)立的用戶程序,它的執(zhí)行不依賴于內(nèi)核。與Multics的前身類似,它實(shí)現(xiàn)了通配符等概念(例如:*。txt),但這些功能并沒有內(nèi)置到shell中,而是在一個(gè)名為“glob”的獨(dú)立實(shí)用程序中實(shí)現(xiàn)。同樣,用于計(jì)算條件表達(dá)式的命令也是分開的。這種分離策略保持了shell的緊湊性,其源代碼少于900行。
shell語言的演變
1977年,斯蒂芬·伯恩出版了《伯恩的殼》,以解決湯普森殼的劇本限制。該版本增加了額外的功能,例如調(diào)度腳本和循環(huán)的能力。Bourne shell不僅是一個(gè)重要的進(jìn)步,而且現(xiàn)在主流Linux系統(tǒng)使用的許多shell都將其作為錨點(diǎn)。
1978年,C shell發(fā)布并迅速成為Unix系統(tǒng)上流行的命令解釋器。它是由Bill Joy開發(fā)的Unix shell的變體。C shell的主要設(shè)計(jì)目標(biāo)是它看起來更像C編程語言,并且更適合交互式使用。
1983年7月14日,大衛(wèi)·科恩(大衛(wèi)·科恩)在USENIX的年度技術(shù)會(huì)議上發(fā)布了科恩殼牌。它的開發(fā)目標(biāo)是繼承C shell和Tab C-shell的所有功能,包括腳本和循環(huán)處理,這些功能與Bourne shell相同。Ksh93是Korn shell的一個(gè)流行的開源版本,于1993年獲得了開源的地位。在其與Bourne shell的良好兼容性中,還引入了其他shell語言的特性,例如csh的歷史功能。
1989年,Bash是Brian Fox為GNU項(xiàng)目編寫的Unix shell和命令語言,旨在成為Bourne shell的免費(fèi)軟件替代品。Bash的語法和功能受Bourne shell的影響,但增加了許多新功能和改進(jìn)。作為Bourne shell的繼承者,Bash繼承了前代shell的許多功能,并引入了更多功能。即使在今天,Bash仍然是Unix和Linux社區(qū)中最常用的shell之一。
1989年5月30日,Almquist shell上市(通常簡(jiǎn)稱為“ash”)。它是由Kenneth Almquist(Kenneth Almkvist)開發(fā)的輕量級(jí)Unix shell。它被設(shè)計(jì)為傳統(tǒng)Bourne shell(sh)的更緊湊、更高效的替代品。Ash shell通常用于嵌入式系統(tǒng)和其他資源有限且效率至關(guān)重要的環(huán)境。在FreeBSD、NetBSD、DragonFly BSD和Minix上,默認(rèn)安裝的shell(/bin/sh)派生自ash。在Linux上,開發(fā)了Debian Almquist shell。
1990年,Z shell(zsh)是一個(gè)功能豐富的Unix shell,由Paul Falstad(Paul Follestad)開發(fā)。它在Bourne shell、Bash和Korn shell的基礎(chǔ)上增加了許多新功能和改進(jìn),旨在提供一個(gè)更強(qiáng)大、更靈活的命令解釋器環(huán)境。從macOS Catalina開始,Mac將使用zsh作為整個(gè)操作系統(tǒng)的默認(rèn)登錄shell和交互shell。
2005年,發(fā)布了新的命令行界面工具fish shell(也稱為友好交互式shell)。它由Axel Liljencrantz等開發(fā)人員共同創(chuàng)建。其特點(diǎn)是具有自動(dòng)補(bǔ)全、顏色突出顯示和動(dòng)態(tài)建議等便捷功能,并具有出色的可讀性和豐富的插件生態(tài)。此外,fish shell還有一個(gè)活躍的開發(fā)者社區(qū),不斷推出新功能和優(yōu)化改進(jìn)。隨著UNIX的流行,對(duì)更強(qiáng)大和通用的腳本語言的需求也在增加。Scheme shell(scsh)通過使用Scheme(LISP語言的衍生物)提供了一個(gè)腳本環(huán)境。Pyshell試圖使用Python實(shí)現(xiàn)類似的功能。在嵌入式系統(tǒng)上,BusyBox將shell和所有命令集成到一個(gè)二進(jìn)制可執(zhí)行文件中,從而簡(jiǎn)化了分發(fā)和管理。許多早期的shell想法和接口已經(jīng)保存了近35年,這是作者們不懈努力的證明。雖然外殼不斷刷新自己,但本質(zhì)上并沒有太大變化。盡管有創(chuàng)造特殊外殼的新嘗試,但Bourne shell及其衍生產(chǎn)品仍是使用最廣泛的。
形式分類
Shell是用戶與操作系統(tǒng)內(nèi)核進(jìn)行交互的界面,可以用命令行或圖形界面兩種形式表示。
圖形用戶界面外殼:GUI shell允許用戶通過圖形操作界面輕松選擇、拖動(dòng)和執(zhí)行其他直觀操作來執(zhí)行任務(wù)和配置系統(tǒng)設(shè)置,這對(duì)新手用戶來說更加友好和容易。相反,命令行shell需要用戶輸入特定的命令來執(zhí)行操作,這需要用戶具有一定的專業(yè)知識(shí)和技能。GUI shell通常作為桌面環(huán)境的一部分來實(shí)現(xiàn),如GNOME、KDE等離子體、XFCE等。這些桌面環(huán)境提供了一系列組件,如窗口管理器、面板、系統(tǒng)托盤等。,它們構(gòu)成了用戶可以看到的圖形界面。GUI shell中的資源管理器和設(shè)置界面等特定工具也是這些桌面環(huán)境的一部分。它們通常用各種編程語言和圖形庫(如GTK+、Qt等)編寫。),它為創(chuàng)建圖形界面提供了必要的功能和工具。
命令行外殼:CLI shell通常指用戶通過命令行界面輸入文本命令與操作系統(tǒng)進(jìn)行交互的方式。用戶可以直接鍵入命令來執(zhí)行操作。常見命令行shell包括Bash、Zsh、Powershell等。在Linux或MacOS中,它通常被稱為“終端”,而在Windows操作系統(tǒng)中,它被稱為“命令提示符”或“Windows Powershell”。CLI shell為用戶提供了一個(gè)接口,用戶可以通過輸入人類可讀的命令與操作系統(tǒng)進(jìn)行交互,例如“cat、ls、echo”。這些命令將被傳遞給shell執(zhí)行,執(zhí)行結(jié)果將顯示在命令行界面上。CLI shell提供了管理文件、運(yùn)行程序和執(zhí)行系統(tǒng)操作的有效方法。
基本語法
外殼變量:Shell變量是shell程序中用來存儲(chǔ)文本字符串或數(shù)字的變量。Shell變量通常用于存儲(chǔ)臨時(shí)值或用戶輸入,并且可以在shell程序執(zhí)行期間進(jìn)行修改和訪問。在shell中,變量名都是字符串,可以包含字母、數(shù)字和下劃線,并且必須以字母或下劃線開頭。常用的外殼變量包括環(huán)境變量、參數(shù)變量、位置變量和特殊變量。
殼程參數(shù):當(dāng)shell腳本執(zhí)行時(shí),您可以傳入命令行參數(shù),以便腳本可以根據(jù)這些參數(shù)執(zhí)行特定的操作。這些傳入的參數(shù)被腳本中的位置參數(shù)變量引用。位置參數(shù)變量$1、$2和$3分別對(duì)應(yīng)于第一個(gè)、第二個(gè)和第三個(gè)傳入?yún)?shù),依此類推。此外,$ @用于獲取所有傳入?yún)?shù),而$ #用于獲取傳入?yún)?shù)的數(shù)量。
外殼陣列:在shell腳本中,用戶可以使用數(shù)組來存儲(chǔ)一系列數(shù)值或字符串。在大多數(shù)Unix shell中,您可以使用Bash來操作數(shù)組。
殼牌過程控制:在Shell腳本中,流控制用于根據(jù)條件執(zhí)行不同的代碼塊或控制循環(huán)的執(zhí)行。
外殼文件包含:外殼文件包含意味著外殼腳本中的代碼可以通過引用其他文件來執(zhí)行。這對(duì)于從邏輯上將代碼分解成多個(gè)文件以更好地管理和組織代碼非常有用。在shell中,有幾種方法可以包含其他文件,最常用的方法是使用source命令或。符號(hào)。
主要特性
交互性:交互式外殼:用戶可以直接與外殼實(shí)時(shí)交互。用戶可以輸入命令,shell將立即執(zhí)行這些命令并返回結(jié)果。該模式通常用于用戶在命令行界面下直接與系統(tǒng)交互、輸入命令、查看輸出和管理文件。非交互式shell:由shell執(zhí)行的命令:shell來自腳本文件或由重定向標(biāo)準(zhǔn)輸入提供。在這種模式下,shell不會(huì)等待用戶輸入,而是直接執(zhí)行腳本中的命令并將結(jié)果輸出到指定的位置。該模式通常用于自動(dòng)任務(wù)、批處理等場(chǎng)景。
腳本:Shell腳本是包含shell命令的文本文件,具有靈活性和可移植性。可以通過設(shè)置文件第一行的“shebang”來設(shè)置(如#!/bin/bash)來指定腳本的解釋器,以便腳本可以找到正確的解釋器在不同的系統(tǒng)上執(zhí)行。同時(shí),腳本可以接受和處理位置參數(shù),并且可以通過設(shè)置執(zhí)行權(quán)限直接運(yùn)行,這使得shell腳本在自動(dòng)化任務(wù)和系統(tǒng)管理中非常有用。
重定向:Shell重定向和管道允許用戶靈活控制命令的輸入和輸出,實(shí)現(xiàn)數(shù)據(jù)的重定向和傳輸。通過重定向,用戶可以將命令的輸出保存到文件中,或者將文件中的內(nèi)容作為命令的輸入,甚至可以同時(shí)重定向標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤。但是,管道可以直接將一個(gè)命令的輸出轉(zhuǎn)移到另一個(gè)命令作為輸入,從而實(shí)現(xiàn)命令之間的數(shù)據(jù)流通信和處理,從而提高數(shù)據(jù)處理的效率和靈活性。
命令解析:命令擴(kuò)展:shell將從左到右解析、擴(kuò)展和重定向命令。變量賦值和重定向?qū)⑹紫缺4妫促x值或重定向的單詞將被擴(kuò)展,其中第一個(gè)擴(kuò)展的單詞被視為命令名,其余的作為參數(shù)。如果命令只包含賦值和重定向,則賦值會(huì)影響當(dāng)前shell環(huán)境;如果命令名存在,則執(zhí)行該命令。如果試圖對(duì)只讀變量賦值,或者重定向中有錯(cuò)誤,命令將以非零狀態(tài)退出。命令搜索和執(zhí)行:shell將按照一定的順序查找和執(zhí)行命令。如果命令名不包含斜杠,shell將首先檢查是否有同名的shell函數(shù)或內(nèi)置命令,如果沒有,它將在$PATH環(huán)境變量指定的目錄中搜索可執(zhí)行文件。如果命令名包含斜杠或搜索成功,shell將在單獨(dú)的執(zhí)行環(huán)境中執(zhí)行該命令。如果執(zhí)行失敗并且文件不在可執(zhí)行格式或目錄中,則將其視為shell腳本并執(zhí)行。最后,shell將等待命令完成并收集其退出狀態(tài)。命令執(zhí)行環(huán)境:每個(gè)簡(jiǎn)單的命令或shell函數(shù)都在一個(gè)單獨(dú)的執(zhí)行環(huán)境中運(yùn)行,該環(huán)境繼承自shell,但又與之隔離。該環(huán)境包括打開的文件、當(dāng)前工作目錄、文件創(chuàng)建模式掩碼、導(dǎo)出的shell變量和函數(shù)等。子shell或子shell是shell進(jìn)程的副本,其中運(yùn)行的命令不會(huì)影響主shell環(huán)境。此外,在此隔離環(huán)境中,某些shell選項(xiàng)和陷阱設(shè)置可能會(huì)被重置或忽略。這些特點(diǎn)保證了命令執(zhí)行的獨(dú)立性和穩(wěn)定性。
跨平臺(tái):以主流的bash腳本為例,官方提供了posix模式:通過使用- posix或set -o posix命令行選項(xiàng),Bash可以進(jìn)入posix模式,使其更符合POSIX標(biāo)準(zhǔn),并調(diào)整一些默認(rèn)行為以匹配POSIX指定的值。在POSIX模式下,Bash將執(zhí)行一些特定的更改,包括設(shè)置變量POSIXLY_CORRECT,并再次搜索命令哈希表。Bash-4.0引入了shell兼容級(jí)別的概念,允許用戶通過設(shè)置一組shopt選項(xiàng)來選擇Bash的行為,從而在不同版本之間遷移腳本。在使用shell編寫和執(zhí)行腳本時(shí),了解并熟悉這些不同模式和兼容級(jí)別的設(shè)置以確保腳本的正確性和跨平臺(tái)性是非常重要的。根據(jù)特定要求選擇適當(dāng)?shù)哪J胶图嫒菁?jí)別,以確保腳本可以正常運(yùn)行并在不同的環(huán)境中表現(xiàn)出相同的行為。
安全性能
數(shù)據(jù)加密和解密:OpenSSL是一個(gè)開源的密碼學(xué)工具包,它提供了一系列加密和解密算法以及SSL/TLS協(xié)議的實(shí)現(xiàn)。它用于保護(hù)網(wǎng)絡(luò)通信的安全,包括加密、解密、證書頒發(fā)、數(shù)字簽名等功能。通過使用這些方法,用戶可以保護(hù)敏感數(shù)據(jù)的安全,并確保只有授權(quán)用戶才能訪問這些數(shù)據(jù)。日志記錄:在Unix系統(tǒng)上,rSyslogd和syslog-ng等軟件通常用作syslog服務(wù)器。通過Syslog,可以集中記錄和管理整個(gè)系統(tǒng)的日志信息,并幫助管理員監(jiān)控系統(tǒng)的運(yùn)行狀態(tài),解決問題并滿足合規(guī)性要求。安全審計(jì):通過安全審計(jì)shell腳本,可以詳細(xì)記錄用戶在shell中的操作行為,包括執(zhí)行的命令、時(shí)間戳、執(zhí)行環(huán)境等信息,有助于跟蹤用戶的活動(dòng)并在必要時(shí)進(jìn)行調(diào)查和審計(jì)。同時(shí),它還可以幫助識(shí)別潛在的入侵和未經(jīng)授權(quán)的系統(tǒng)訪問,并及時(shí)發(fā)現(xiàn)和處理安全威脅。
主要應(yīng)用
服務(wù)器管理:作為系統(tǒng)管理員管理和配置服務(wù)器的重要工具,shell語言因其易用性和與Unix、Linux等系統(tǒng)的兼容性而備受青睞。通過編寫shell腳本,管理員可以自動(dòng)執(zhí)行各種任務(wù),簡(jiǎn)化日常操作并提高效率和準(zhǔn)確性。無論是簡(jiǎn)單的文件操作還是復(fù)雜的系統(tǒng)管理,shell語言都為業(yè)務(wù)環(huán)境中的服務(wù)器管理提供了強(qiáng)有力的支持。
操作系統(tǒng)操作和維護(hù):Shell腳本廣泛應(yīng)用于操作系統(tǒng)的運(yùn)行和維護(hù)。中文操作系統(tǒng)通常是基于Linux內(nèi)核的發(fā)行版,如麒麟、neokylin和紅旗Linux。使用shell腳本編寫一個(gè)監(jiān)控腳本可以實(shí)時(shí)監(jiān)控系統(tǒng)的運(yùn)行狀態(tài),包括CPU利用率、內(nèi)存占用、磁盤空間等。一旦發(fā)現(xiàn)異常情況,可以發(fā)送電子郵件或短信進(jìn)行報(bào)警。國產(chǎn)操作系統(tǒng)通常使用RPM或DEB包管理工具,安裝、卸載和更新軟件包的腳本可以通過shell腳本編寫,這簡(jiǎn)化了軟件管理的過程。
任務(wù)自動(dòng)化:shell語言的強(qiáng)大功能使用戶可以輕松地自動(dòng)化任務(wù),包括文件和進(jìn)程管理以及執(zhí)行復(fù)雜的命令。其靈活的腳本和腳本能力使其廣泛用于系統(tǒng)編程和管理。通過編寫Shell腳本,用戶可以簡(jiǎn)化重復(fù)性工作,提高效率,并確保任務(wù)的一致性和準(zhǔn)確性。這使得shell語言成為系統(tǒng)管理員和開發(fā)人員不可或缺的工具,這大大簡(jiǎn)化了日常工作中的許多繁瑣任務(wù)。