Shell 是用來解決什麼問題的?
或者說,Shell 因什麼而被創造,它可以被代替嗎?
其實大家都對 Shell 這個概念有誤解,好像一定要是命令行的 Shell 才叫 Shell。其實 Shell,殼,顧名思義就是機器外面的一層殼,用於人機交互,只要是人與電腦之間交互的介面,就可以稱為 Shell,所以我們熟悉的 GNOME、KDE 等圖形界面也都是 Shell,只不過是 GUI Shell。所以像 Bash 等 Shell 當初發明的原因當然也就很容易理解了,就是為了人與機器之間交互的問題,只不過當時的技術還不能做出 GUI,所以就做成了命令行的。
盡量解釋的易於理解。
shell 是用來解決用戶如何與操作系統通信的問題。
shell 就是 殼,區別於 核。
Linux 的 核 叫 kernel , 殼有很多種,有命令行的: bash 、sh 、csh 、ksh, 有圖形化的: KDE、GNOME、CDE、 XFCE ,據說 Linus 那伙人只負責開發 核。
Windows 9X 系列的 核 是 DOS,圖形化的 殼 叫 Windows Explorer ,命令行 殼 叫 command。從 Windows XP 開始,Windows 的 核 叫做 Windows NT (Windows New Technology),圖形化 殼 叫 Windows Explorer ,命令行 殼 有 command 、cmd.exe ,後面還推出了 Windows PowerShell。由於 Windows NT 技術是針對圖形化殼設計出來的核,而 Windows 9X 就是在 DOS 上加了一個 殼。所以 Windows XP 藍屏情況比 Windows 9X 少得多,但也有。另外我見過 Windows 7藍屏,且到目前為止沒有見過 Windows 8 和 Windows 10 藍屏。
可以把 shell 理解為 命令解釋器。
實際上不管是 命令行 shell 還是圖形化 shell ,都是訪問操作系統中的某個具有一定功能、可以處理具體事務的文件(二進位文件 ---- 此類文件經常被稱作工具)、或包含一定內容的文件(文本文件),通常都是通過文件名訪問(當然有例外,比如 Linux 的 alias 命令,比如 通過鏈接文件訪問源文件),所以通常文件名就成了命令。在 Linux 的 /bin 目錄和 /usr/bin 目錄中有 Linux 命令對應的文件,在 Windows 的 %windir% 目錄即 操作系統安裝硬碟分區的 Windows 目錄 和 %windir%system32 目錄中有 Windows 命令對應的文件, 此外還可以引入外部命令和自定義命令。而 shell 的作用就是解釋某條命令對應的文件的文件路徑,供用戶使用並返回使用結果。這也就是為何有 shell 腳本一說。腳本語言是種解釋型語言,不能編譯成二進位代碼,區別於編譯型語言。就如 shell ,它的作用是將命令解釋成對應的文件名,然後通過文件名調用文件。對於圖形化 shell 是通過滑鼠的點擊來訪問文件的,但實際也是通過文件名,因為每個文件都有包含文件名的完整路徑。
當有一天,機器控制了全人類,人類完全成了機器的奴隸,我想 shell 就可以被替代了,應該說是不存在了,因為機器自己會直接調用自己的某個功能。那時候,他們會做很多種如何與人類大腦通信的 shell,用來告訴人類某時某刻、用什麼行為、完成什麼事情、達到什麼效果。當然,就機器控制人類這件事來說,最好的 shell 就是人類語言。咳咳,幽默完了就要嚴肅起來。反過來想,實際上,shell 就是人類告訴機器 某時某刻、用什麼行為、完成什麼事情、達到什麼效果,只不過操作系統是以文件做為基本元素構成的。所以,shell 就是要找到所需文件,也就是要用什麼行為。而 某時某刻 、完成什麼事情可以理解為參數,達到的效果就看用戶對各種命令的熟悉程度了,因為多個命令(多個具有一定功能的文件)可以靈活的組合使用,如 Linux 管道符就能實現多個命令組合使用。
很多時候,很多人,包括我,在學習時都懶得看理論部分,認為計算機科學是門應用科學,只要掌握技能就行,理論那些逐漸就懂了。可事實不是這樣的,長期對某件事物知其然不知其所以然會讓人變得對某件事物沒有追求,最後在 困惑—忽略困惑—麻木 這一過程中變得平庸。所以,困惑的時候,何不看看書?Linux的命令行介面歸結起來就是各種Shell,那麼到底什麼是Shell?
Shell就是一個命令行解釋器 ,它的作用是解釋執行用戶的命令,用戶輸入一條命令,Shell就解釋執行一條,這種方式稱為互動式(Interactive)。
Shell,譯為外殼,是用戶直接連入計算機所使用的計算機程序,負責解析用戶提供的命令,如詞法分析、語法分析、句法分析。
1.Shell的分類
Linux 的命令 shell 是與操作系統相分離的一層。不同的 shell 環境影響您具備不同的功能,比如可編輯的命令行和歷史命令回查等。shell 還決定了腳本中函數的語法。
下面就列舉幾個常用的Shell:1. bashbash shell 是 Bourne shell 的一個免費版本,它是最早的 Unix shell,包括許多附加的特點。Bash 有可編輯的命令行,可以回查歷史命令,支持 tab 鍵補齊以使用戶避免輸入長的文件名。2. cshC shell 使用的是「類C」語法,借鑒了 Bourne shell 的許多特點,只是內部 shell 命令集有所不同。3. kshKorn shell 的語法與 Bourne shell 相同,同時具備了 C shell 的易用特點。許多安裝腳本都使用 ksh ,即使您不把它作為您的主 shell,您也應該在系統中安裝它。4. tcshTC shell 是 C shell 的一個增強版本,與 C shell 完全兼容。
5. zshZ shell 是 Korn shell 的一個增強版本,具備 bash shell 的許多特色。&> 默認的 shell 是每個用戶帳號的一個參數。Linux 中典型的默認 shell 是 /bin/bash,不過也可以用其他的 shell。每個 shell 的 man 文檔實際上都非常好,都對各種 shell 及其使用進行了詳細的說明。2.Bash Shell的界面和命令處理機制
Bash Shell的命令提示符:
[ username@hostname working_directory ] {#|$}看起來可能有些亂,下面來具體介紹一下吧。username: 用戶登入Linux系統所使用的用戶hostname: 當前主機的主機名,非完整格式working_directory :用戶當前所在目錄,隨著用戶的目錄切換而切換的『#』: 管理員賬號登陸,為root,擁有最高許可權,能執行所有操作;
『$』: 普通用戶,非root用戶登錄,不具有管理員許可權,不能執行系統管理類操作;shell命令的處理機制
shell程序在接收到用戶執行命令的請求,分析完成之後,最左側的字元串會被當作命令,具體查找順序如下:1. 查找內部命令2. 根據PATH環境變數中設定的目錄,自左向右逐個搜索目錄下的文件名&> 注意:為了安全起見,建議使用非管理員賬號登陸!執行管理操作時,臨時切換至管理員賬號,操作完成後即退回。3.Bash Shell的特性
bash shell有很多的特性,基於這些特性讓bash shell變得非常易用。
序號 | 特性
—— | ——
1 | 支持命令歷史2 | 支持管道、重定向3 | 支持命令別名4 | 支持命令行編輯5 | 支持命令行展開6 | 支持文件名通配(globbing) 7 | 支持使用變數8 | 支持編程9 | 支持命令補全10 | 支持路徑補全
11 | 支持命令別名12 | 支持命令引用(替換)4.Bash Shell基礎知識
Bash Shell文件名通配符
通配符號 | 含義
———— | ——* | 可以用於匹配任意長度的任意字元? | 可以匹配任意單個字元[] | 可以匹配指定範圍內的任意單個字元,例如:[a-zA-Z]*[0-9], 以單個字母開頭,以數字結尾的字元串[^] | 匹配指定範圍之外的任意單個字元還有一些還有一些特殊的通配符,還需要再加上[]才能使用,這些也支持取反格式:[^[]]
通配符號 | 含義
———— | —— [:space:] | 空白字元[:punct:] | 標點符號[:lower:] | 小寫字母[:upper:] | 大寫字母[:alpha:] | 大小寫字母[:digit:] | 數字[:alnum:] | 數字和大小寫字母&> 還有更多的特殊通配符,可以通過man 7 glob來查詢幫助
命令補全
在用戶輸入命令的部分字母后,可以敲擊Tab鍵,通過Bash Shell的命令不全功能,在PATH環境變數中搜索與之前敲擊字元相同的命令,並進行自動補全,如果出現多個,再敲擊一次Tab,則會以列表形式展現出來。路徑補全
用戶可以在輸入路徑、文件時不必輸入路徑或文件的全部名稱,而是根據給定的起始路徑,輸入能夠唯一代表該路徑或文件的部分字元後,通過Tab鍵進行路徑補全,提高輸入效率。如果輸入的字元不能唯一代表路徑或文件,需要再次敲擊Tab鍵,以列表形式列出符合要求的路徑或文件。命令執行的狀態結果
Bash Shell通過狀態返回值來輸出命令的執行結果:成功:0失敗:1-255命令執行完成之後,其狀態返回值會保存於Bash Shell的特殊變數$?中。示例:
~]# echo $?一般在執行完某一個指定命令後執行,來查看命令的執行狀態結果。命令引用(替換)用法 – 把命令中某個子命令替換為其執行結果的過程
命令替換可以使用兩種方法:$()或者 `COMMAND`是反引號示例:用pwd命令的結果替換:echo "The current directory is $(pwd)"用date命令的結果替換:touch ./file-$(date +%Y-%m-%d-%H-%M-%S).txt命令行展開
符號 | 含義
—— | ——~ | 自動展開為用戶的家目錄,或指定用戶的家目錄{} | 可承載一個以逗號分割的路徑列表,並能夠將其展開為多個路徑示例:
/tmp/{a,b},相當於/tmp/a和/tmp/b練習題:
1. 創建/tmp/x/y1, /tmp/x/y2, /tmp/x/y1/a, /tmp/x/y1/b~]# mkdir -pv /tmp/x/{y1/{a,b},y2}2. 創建/tmp/a_c, a_d, b_c, b_d~]# mkdir -v /tmp/{a,b}_{c,d}3. 創建如下目錄結構:~]# mkdir -pv /tmp/mylinux/{bin,boot/grub,dev,etc/{rc.d/init.d,sysconfig/network-scripts},lib/modules,lib64,proc,sbin,sys,tmp,usr/local/{bin,sbin},var/{lock,log,run}}
Bash Shell支持的引號
引號類型 | 作用
———— | ——反引號「或 $() | 命令引用(替換)雙引號」」 | 弱引用,可以實現變數替換單引號『』 | 強引用,不完成變數替換命令行編輯中游標跳轉快捷鍵
快捷鍵 | 作用
——— | ——Ctrl+a | 跳到命令行首Ctrl+e | 跳到命令行尾Ctrl+u | 刪除游標至命令行首的內容Ctrl+k | 刪除游標至命令行尾的內容Ctrl+l | 清屏系統輸入輸出設備
設備類型 | 表現形式 | 代碼 | 具體設備
———— | ———— | —— | ————標準輸入 | STDIN | 0 | 鍵盤標準輸出 | STDOUT | 1 | 顯示器標準錯誤輸出 | STDERR | 2 | 顯示器I/O重定向
定義:將默認輸入輸出設備改變成指定的輸入輸出設備上的過程符號 | 作用
—— | ——&> | 標準輸出重定向,覆蓋輸出&>&> | 標準輸出重定向,追加輸出2&> | 錯誤輸出重定向,將錯誤輸出至設備,覆蓋輸出2&>&> | 錯誤輸出重定向,將錯誤輸出至設備,追加輸出&> | 重定向標準輸出和錯誤輸出至同一個文件,覆蓋輸出&< | 標準輸入重定向,覆蓋輸入&<&< | 標準輸入重定向,輸入多行。示例1:&~]# cat << EOF&
> hello&
> I am leo&
> EOF&
hello&
I am leo&
示例2:&
~]# cat >> /tmp/a.txt << EOF&
> 123&
> 456&
> 789&
> EOF&
~]# cat /tmp/a.txt&
123&
456&
789&
&> 可以通過set命令禁止對已存在的文件使用覆蓋重定向。set -C: 禁止對已存在文件使用覆蓋重定向如果仍然想強制覆蓋輸出,則使用&>|代替&>即可。set +C:關閉禁用使用覆蓋重定向的功能
管道
定義:把前一個命令的輸出,作為後一個命令的輸入命令格式:命令1 | 命令2 | 命令3 | …示例1:echo "hello, world." | tr "a-z""A-Z" 將hello,world.字元全部變成大寫。示例2:
echo "redhat" | passwd --stdin hive將hive的密碼改為redhat示例3:
cut -d: -f3 /etc/passwd | sort -n將/etc/passwd文件中以:為分隔符的第三個欄位(UID)按數值升序排列在沒有操作系統GUI界面的時候,作為人機交互的媒介。 程序員???? shell???? OS Kernel
shell是用來進行用戶和內核通信的,就像一個翻譯,用戶發出一個指令,然後shell翻譯給內核,內核執行完畢後,把結果給shell,shell再翻譯給用戶。雖然我們習慣上把CLI叫shell,其實GNOME、MATE之類的GUI也是shell
Shell就是在圖形用戶界面出現前提供你和操作系統交互的方式。
通過鍵盤輸入命令,命令把結果輸出到字元終端上shell是相對kernel來說的。
kernel負責和硬體打交道,服務於軟體;shell和其他軟體一樣都是和kernel打交道,直接服務於用戶。GUI和CLI都是shell,和其他軟體不同,shell主要用來管理文件和運行程序。shell一開始被發明的原因就像上面所說,歷史原因啊,沒有圖形頁面時代的產物。
至於能不能被替代,我個人覺得沒什麼不能的,windows不就可以不用shell。
只是從另一個角度來說,shell對於部分人群還是很有用的。
比如說unix的設計哲學之一:一切都是文件。
cat "a.txt" | grep "hello" | wc -l
類似這種其實已經表達了在linux下把一切當作文件的簡潔性。
這也是為什麼linux下大部分文件都是"純文本格式",程序之間的溝通成本很低,而且不依賴專有程序,外加上一大堆很有用的小程序,可以隨意組合而不必考慮程序之間輸入輸出的區別,才讓shell很方便。
(比如windows修改個配置必須去打開註冊表專用程序, 更正,由於本人無知這句話是錯誤的,註冊表可以在windows里通過dos去修改,暫時想不到更好的例子了) 。
又比如說ssh遠程連接,這個還是很實用的,傳輸文字的成本跟傳輸畫面的成本完全不是一個數量級啊。
這個屬於系統設計的哲學,你要說能不能不用shell吧,我覺得沒有什麼,或者說,是沒有任何操作(這句可能不嚴謹)是必須用shell才能完成的,人家普通人用10年電腦也沒碰過一次shell的不是大有人在。
只是說在*nix系統之下,圍繞shell開發的程序很多,而且對於部分人來說操作shell很方便,所以俺們習慣了,覺得離了shell不行,僅此而已。以前有一個懶程序猿,由於工作的原因,需要不斷的敲命令。突然有一天發現自己敲的大部分命令都是重複的,於是懶程序員就想寫一個程序,來幫助自己批量敲命令執行,這樣自己只需敲一遍就行了。
搗鼓了半個月,終於寫出一個解析器,可以讀取一個文件,然後把文件里的命令一條一條的執行。
懶程序員很開心,覺得自己是個天才,於是把這個程序分享出去。這讓懶程序猿二號瞧見了,吐槽了一把:還能這麼干,不錯。怎麼連 if-else 都沒有,來來來,我再加把火。。。
不久之後,網上出現了一個項目,叫做 shell。
(編不下去了→_→)這個問題百度百科Linux Shell_百度百科有很好的解釋。Windows下你覺得桌面就是用戶操作這個系統的介面。但是Linux不一樣,shell就是用戶與內核進行交互操作的一種介面。比如你要查看網卡,你就要執行ifconfig,這個ifconfig是一個命令,當你輸入ifconfig[回車]的時候,這個shell就開始工作了,看ifconfig是什麼、在哪裡、何種方式去打開/執行。當執行過程中或執行完畢會有什麼顯示結果,還會返回一個退出狀態(成功or失敗?)。而桌面只是shell之上的一個軟體。你在桌面的操作很多都是要通過shell去執行的。還有一種就是shell腳本,shell腳本就是當你有時候需要執行多次繁雜而有重複的操作的時候,可能為了方便,將你要做的事情寫成shell腳本,然後由上面說的shell去幫你自動執行這個操作
UNIX設計思想之一就是把計算機包裝成這麼一種計算環境:小程序、可重用的程序用C寫,大型程序通過IPC組合各個C編寫的小程序來寫。而Shell就是IPC編程語言之一,不僅可以交互使用,還可以無值守地執行自動腳本
裝逼神器。A:哇,這是什麼好厲害。B:..@...$: ls ...@...$: ........ .......... ........... .......... ..........
linux中,萬物皆是文件,所有的操作都是基於文件進行,沒了文件什麼也玩不了。這麼多文件就只能一個個去調用嗎?我想一次性用好幾個怎麼辦?就出現了批處理。我想用一些邏輯來做出判斷怎麼辦,就出現了語句。 關於shell能不能代替,仁者見仁吧。
#!/bin/bash
#shell能不能被代替呢
a=1
b=2
if [ $a == $b ]
then
echo "shell可以被代替"
fi
if [ $a != $b ]
then
echo "shell不可以被代替"
fi #仁者見仁
do shell script 調用你的 shell 過程中並不會處理你的某某rc,於是也讀不到你特別的 PATH 設置。do shell script ". /etc/profile; ./etc/bashrc; . ~/.bashrc; . ~/.bash_profile; 原來的那些東西"改環境和改腳本本身比永遠是更理想的解法。
解決部分程序員的溫飽問題~(吐得一口好槽)
Shell 和 kernel
一種訪問系統資源的介面。
一切問題都可以解決。
早先的計算機是只有圖形界面而沒有字元終端的.後來大家發現, 很多重複的操作沒辦法自動化實現, 只能用按鍵精靈之類的東西錄製下來. 而且如果輸入是變化的, 那麼按鍵精靈也不好使(會讓錄製難度變得很大)於是大家就發明了一種叫做字元終端的東西, 讓你方便的完成圖形界面下難以實現的任務. 比如, 我有400個文本文檔, 我想找出這400個文本文檔中所有以`Name:`開頭的行統一放到一個新文本文檔里. 你用按鍵精靈錄製實在是太累了.
推薦閱讀:
※低配置的老機子適合裝哪一款Linux?
※Ubuntu Kylin的核心技術體現在哪裡?
※Linux 下的 C 編程有哪些值得推薦的好書?
※Android Studio如何調試Framework層的代碼?
※為什麼 Linus Torvalds 用 Fedora 而不用 Ubuntu 或 Windows?