linux系統shell
IT路邊社
前言
與其它的編碼規范一樣,這里所討論的不僅僅是編碼格式美不美觀的問題, 同時也討論一些約定及編碼標准。這份文檔主要側重於我們所普遍遵循的規則,對於那些不是明確強制要求的,我們盡量避免提供意見。
編碼規范對於程序員而言尤為重要,有以下幾個原因:
本文檔中的准則致力於最大限度達到以下原則:
盡管本文檔涵蓋了許多基礎知識,但應注意的是,沒有編碼規范可以為我們回答所有問題,開發人員始終需要再編寫完代碼後,對上述原則做出正確的判斷。
注 :未明確指明的則默認為必須(Mandatory)
主要參考如下文檔:
僅建議Shell用作相對簡單的實用工具或者包裝腳本。因此單個shell腳本內容不宜太過復雜。
在選擇何時使用shell腳本時時應遵循以下原則:
可執行文件不建議有擴展名,庫文件必須使用 .sh 作為擴展名,且應是不可執行的。
執行一個程序時,無需知道其編寫語言,且shell腳本並不要求具有擴展名,所以更傾向可執行文件沒有擴展名。
而庫文件知道其編寫語言十分重要,使用 .sh 作為特定語言後綴的擴展名,可以和其他語言編寫的庫文件加以區分。
文件名要求全部小寫, 可以包含下劃線 _ 或連字元 - , 建議可執行文件使用連字元,庫文件使用下劃線。
正例:
反例:
源文件編碼格式為UTF-8。避免不同操作系統對文件換行處理的方式不同,一律使用 LF 。
每行最多不超過120個字元。每行代碼最大長度限制的根本原因是過長的行會導致閱讀障礙,使得縮進失效。
除了以下兩種情況例外:
如出現長度必須超過120個字元的字元串,應盡量使用here document或者嵌入的換行符等合適的方法使其變短。
示例:
除了在行結束使用換行符,空格是源文件中唯一允許出現的空白字元。
對從來沒有用到的或者被注釋的方法、變數等要堅決從代碼中清理出去,避免過多垃圾造成干擾。
Bash 是唯一被允許使用的可執行腳本shell。
可執行文件必須以 #!/bin/bash 開始。請使用 set 來設置shell的選項,使得用 bash echo "Process $: Done making $$$."
# 示例7:命令參數及路徑不需要引號 grep -li Hugo /dev/ "$1"
# 示例8:常規變數用雙引號,ccs可能為空的特殊情況可不用引號 git send-email --to "${reviewers}" ${ccs:+"--cc" "${ccs}"}
# 示例9:正則用單引號,$1可能為空的特殊情況可不用引號 grep -cP '([Ss]pecial||?characters*) ${1:+"$1"}
# 示例10:位置參數傳遞推薦帶引號的"$@",所有參數作為單字元串傳遞用帶引號的"$*" # content of t.sh func_t { echo num: $# echo args: 1:$1 2:$2 3:$3 }
func_t "$@" func_t "$*" # 當執行 ./t.sh a b c 時輸出如下: num: 3 args: 1:a 2:b 3:c num: 1 args: 1:a b c 2: 3:
使用 $(command) 而不是反引號。
因反引號如果要嵌套則要求用反斜杠轉義內部的反引號。而 $(command) 形式的嵌套無需轉義,且可讀性更高。
正例:
反例:
條件測試
使用 [[ ... ]] ,而不是 [ , test , 和 /usr/bin/[ 。
因為在 [[ 和 ]] 之間不會出現路徑擴展或單詞切分,所以使用 [[ ... ]] 能夠減少犯錯。且 [[ ... ]] 支持正則表達式匹配,而 [ ... ] 不支持。參考以下示例:
盡可能使用變數引用,而非字元串過濾。
Bash可以很好的處理空字元串測試,請使用空/非空字元串測試方法,而不是過濾字元,讓代碼具有更高的可讀性。正例:
反例:
正例:
反例:
正例:
反例:
文件名擴展
當進行文件名的通配符擴展時,請指定明確的路徑。
當目錄中有特殊文件名如以 - 開頭的文件時,使用帶路徑的擴展通配符 ./* 比不帶路徑的 * 要安全很多。
應該避免使用eval。
Eval在用於分配變數時會修改輸入內容,但設置變數的同時並不能檢查這些變數是什麼。反例:
請使用進程替換或者for循環,而不是通過管道連接while循環。
這是因為在管道之後的while循環中,命令是在一個子shell中運行的,因此對變數的修改是不能傳遞給父shell的。
這種管道連接while循環中的隱式子shell使得bug定位非常困難。反例:
如果你確定輸入中不包含空格或者其他特殊符號(通常不是來自用戶輸入),則可以用for循環代替。例如:
使用進程替換可實現重定向輸出,但是請將命令放入顯式子 shell,而非 while 循環創建的隱式子 shell。例如:
總是檢查返回值,且提供有用的返回值。
對於非管道命令,使用 $? 或直接通過 if 語句來檢查以保持其簡潔。
例如:
當內建命令可以完成相同的任務時,在shell內建命令和調用外部命令之間,應盡量選擇內建命令。
因內建命令相比外部命令而言會產生更少的依賴,且多數情況調用內建命令比調用外部命令可以獲得更好的性能(通常外部命令會產生額外的進程開銷)。
正例:
反例:
載入外部庫文件不建議用使用.,建議使用source,已提升可閱讀性。正例:
反例:
除非必要情況,盡量使用單個命令及其參數組合來完成一項任務,而非多個命令加上管道的不必要組合。常見的不建議的用法例如:cat和grep連用過濾字元串; cat和wc連用統計行數; grep和wc連用統計行數等。
正例:
除特殊情況外,幾乎所有函數都不應該使用exit直接退出腳本,而應該使用return進行返回,以便後續邏輯中可以對錯誤進行處理。正例:
反例:
推薦以下工具幫助我們進行代碼的規范:
原文鏈接:http://itxx00.github.io/blog/2020/01/03/shell-standards/
獲取更多的面試題、腳本等運維資料點擊: 運維知識社區 獲取
腳本之---簡訊轟炸機
腳本之---QQ微信轟炸機
ansible---一鍵搭建redis5.0.5集群
elk7.9真集群docker部署文檔
全球最全loki部署及配置文檔
最強安全加固腳本2.0
一鍵設置iptbales腳本
㈡ Linux系統的主要shell的名字和它們各自默認的提示符是什麼
Linux系統的主要 shell 有以下幾種:
BASH (Bourne-Again SHell) 默認提示檔高符:$
SH (Bourne SHell) 默認提示符:燃衫$
CSH (C SHell) 默認提示行段尺符:%
TCSH (Tenex C SHell) 默認提示符:%
KSH (Korn SHell) 默認提示符:$
其中,BASH 是最常用的 shell。
㈢ linux怎麼通過shell查找到某一個文件的絕對路徑
Linux下查找文件的絕對路徑可以用whereis、locate或者find命令。如果想快速查找到文件的絕對路徑,最好是用whereis或者locate命令,它們的查找速度要比find命令快很多,這是因為在Linux系統中有個資料庫,記錄了系統內的所有文件,而whereis和locate命令就是在這個資料庫中查找,並沒有實際查找硬碟,而資料庫查找往往是非常快的;而find命令是直接查找硬碟,如果硬碟文件比較多,就比較費時間。
注意一點:whereis和locate命令的資料庫是一天更新一次,所以有時候會找到已經刪除的文件,還會有找不到最新剛剛創建文件的情況,當明明記得有卻找不到時,就用find命令來查找。
find用法:
find 要查找的路徑 參數
-name參數:指定要查找的文件名
-user參數:指定要查找的文件所屬用戶
-type參數指定查找文件的類型,分別有d目錄、l連接文件、s socket文件等,find命令的使用例子:
find /home -name myfile.txt
上面的命令在/home路徑下查找myfile.txt的絕對路徑。
㈣ LINUX快速入門第八章:Shell基礎
我們平時所說的 Shell 可以理解為 Linux 系統提供給用戶的使用界面。Shell 為用戶提供了輸入命令和參數並可得到命令執行結果的環境。當一個用戶登錄 Linux 之後,系統初始化程序 init 就根據 /etc/passwd 文件中的設定,為每個用戶運行一個被稱為 Shell(外殼)的程序。
確切地說,Shell 是一個命令行解釋器,它為用戶提供了一個向 Linux 內核發送請求以便運行程序的界面系統級程序,用戶可以用 Shell 來啟動、掛起、停止甚至編寫一些程序。
Shell 處在內核與外層應用程序之間,起著協調用戶與系統的一致性、在用戶與系統之間進行交互的作用。圖 1 是 Linux 系統層次結構圖,Shell 接收用戶輸入的命令,並把用戶的命令從類似 abed 的 ASCII 碼解釋為類似 0101 的機器語言,然後把命令提交到系統內核處理;當內核處理完畢之後,把處理結果再通過 Shell 返回給用戶。
換句話說:
Shell 是一個用 C 語言編寫的程序,它是用戶使用 Linux 的橋梁。Shell 既是一種命令語言,又是一種程序設計語言。
Shell 是指一種應用程序,這個應用程序提供了一個界面,用戶通過這個界面訪問操作系統內核的服務。
Ken Thompson 的 sh 是第一種 Unix Shell,Windows Explorer 是一個典型的圖形界面 Shell。
Shell 與其他 Linux 命令一樣,都是實用程序,但它們之間還是有區別的。一旦用戶注冊到系統後,Shell 就被系統裝入內存並一直運行到用戶退出系統為止;而一般命令僅當被調用時,才由系統裝入內存執行。
與一般命令相比,Shell 除了是一個命令行解釋器,同時還是一門功能強大的編程語言,易編寫,易調試,靈活性較強。作為一種命令級語言,Shell 是解釋性的,組合功能很強,與操作系統有密切的關系,可以在 Shell 腳本中直接使用系統命令。大多數 Linux 系統的啟動相關文件(一般在 /etc/rc.d 目錄下)都是使用 Shell 腳本編寫的。
同傳統的編程語言一樣,Shell 提供了很多特性,這些特性可以使 Shell 腳本編程更為有用,如數據變數、參數傳遞、判斷、流程式控制制、數據輸入和輸出、子程序及中斷處理等。
說了這么多,其實我們在 Linux 中操作的命令行界面就是 Linux 的 Shell,也就是 Bash,但是我們的圖形界面是 Shell 嗎?其實從廣義講,圖形界面當然也是 Shell,因為它同樣用來接收用戶的操作,並傳遞到內核進行處理。不過,這里的 Shell 主要指的是 Bash。
Shell 腳本
Shell 腳本(shell script),是一種為 shell 編寫的腳本程序。
業界所說的 shell 通常都是指 shell 腳本,但讀者朋友要知道,shell 和 shell script 是兩個不同的概念。
由於習慣的原因,簡潔起見,本文出現的 "shell編程" 都是指 shell 腳本編程,不是指開發 shell 自身。
Shell的分類
目前 Shell 的版本有很多種,如 Bourne Shell、C Shell、Bash、ksh、tcsh 等,它們各有特點,下面簡要介紹一下。
最重要的 Shell 是 Bourne Shell,這個命名是為了紀念此 Shell 的發明者 Steven Bourne。從 1979 年起,UNIX 就開始使用 Boume Shell。Bourne Shell 的主文件名為 sh,開發人員便以 sh 作為 Bourne Shell 的主要識別名稱。
雖然 Linux 與 UNIX 一樣,可以支持多種 Shell,但 Boume Shell 的重要地位至今仍然沒有改變,許多 UNIX 系統中仍然使用 sh 作為重要的管理工具。它的工作從開機到關機,幾乎無所不包。在 Linux 中,用戶 Shell 主要是 Bash,但在啟動腳本、編輯等很多工作中仍然使用 Bourne Shell。
C Shell 是廣為流行的 Shell 變種。C Shell 主要在 BSD 版的 UNIX 系統中使用,發明者是柏克萊大學的 Bill Joy。C Shell 因為其語法和 C 語言類似而得名,這也使得 UNIX 的系統工程師在學習 C Shell 時感到相當方便。
Bourne Shell 和 C Shell 形成了 Shell 的兩大主流派別,後來的變種大都吸取這兩種 Shell 的特點,如 Korn、 tcsh 及 Bash。
Bash Shell 是 GNU 計劃的重要工具之一,也是 GNU 系統中標準的 Shell。Bash 與 sh 兼容,所以許多早期開發出來的 Bourne Shell 程序都可以繼續在 Bash 中運行。現在使用的 Linux 就使用 Bash 作為用戶的基本 Shell。
Bash 於 1988 年發布,並在 1995-1996年推出Bash 2.0。在這之前,廣為使用的版本是1.14,Bash 2.0增加了許多新的功能,以及具備更好的兼容性。表 2 中詳細列出了各版本的具體情況。
注意,Shell 的兩種主要語法類型有 Bourne 和 C,這兩種語法彼此不兼容。Boume 家族主要包括 sh、ksh、Bash、psh、zsh;C 家族主要包括 csh、tcsh(Bash 和 zsh 在不同程序上支持 csh 的語法)。
本章講述的腳本編程就是在 Bash 環境中進行的。不過,在 Linux 中除了可以支持 Bash,還可以支持很多其他的 Shell。我們可以通過 /etc/shells 文件來査詢 Linux 支持的 Shell。命令如下:
在 Linux 中,這些 Shell 是可以任意切換的,命令如下:
用戶信息文件 /etc/passwd 的最後一列就是這個用戶的登錄 Shell。命令如下:
大家可以看到,root 用戶和其他可以登錄系統的普通用戶的登錄 Shell 都是 /bin/bash,也就是 Linux 的標准 Shell,所以這些用戶登錄之後可以執行許可權允許范圍內的所有命令。不過,所有的系統用戶(偽用戶)因為登錄 Shell 是 /sbin/ndogin,所以不能登錄系統。
筆記:
sh/bash/csh/Tcsh/ksh/pdksh等shell的區別
㈤ shell命令和linux命令一樣么
Linux命令就是shell命令。不同的shell有不同的命令。Linux命令包括所有的shell
㈥ 來學一學LINUX系統中SHELL環境的搭建技巧
什麼是 LINUX SHELL環境?shell在會話中會保存著大量信息,而這些信息就是shell環境。LINNX命令程序通過獲取SHELL環境中的數據(此處的數據通常稱為環境變數)來輸出本機相應的配置數據。
LINUX環境變數
Linux shell環境中存儲了兩種基本類型的數據:環境變數和shell變數。當然,除了變數,shell也存儲了一些可編程的數據,即別名和shell 函數。
如何查看環境變數呢?
我們可以用bash命令set,或者使用printenv命令程序來查看環境變數。
它們的區別是:set 命令不僅顯示shell數據,而且可以顯示環境變數列表,而printenv命令僅僅顯示環境變數列表。
鑒於環境變數列表比較長,我們可以將每個命令的輸出通過管道符傳遞給less 來輸出列表,例如:
//執行命令
[test@linuxprobe ~]$ printenv | less
//輸出內容:環境變數及其數值的列表
KDE_MULTIHEAD=false
SSH_AGENT_PID=6666
HOSTNAME= linuxprobe
GPG_AGENT_INFO=/tmp/gpg-PdOt7g/S.gpg-agent:6689:1
SHELL=/bin/bash
TERM=xterm
XDG_MENU_PREFIX=kde-
HISTSIZE=1000
XDG_SESSION_COOKIE=-1208521990.996705
-1177056199
GTK2_RC_FILES=/etc/gtk-2.0/gtkrc:/home/me/.gtkrc-2.0:/home/me/.kde/sh
are/config/gtkrc-2.0
GTK_RC_FILES=/etc/gtk/gtkrc:/home/me/.gtkrc:/home/me/.kde/share/confi
g/gtkrc
GS_LIB=/home/me/.fonts
WINDOWID=29360136
QTDIR=/usr/lib/qt-3.3
QTINC=/usr/lib/qt-3.3/include
KDE_FULL_SESSION=true
USER=test
LS_COLORS=no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01
:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe:
//printenv 命令也可輸出特定變數- USER的數值:
[test@linuxprobe ~]$ printenv USER
test
建立LINUX shell 環境
每當我們登錄系統後,bash 程序就會自動啟動,且會讀取一系列配置腳本,這些配置腳本被稱為啟動文件。這些啟動文件定義了可供所有用戶共享的默認shell 環境。
那麼位於家目錄中的啟動文件,定義了用戶個人的shell 環境。
確切的啟動順序取決於shell 會話類型模式。有兩種shell 會話類型模式:一個是登錄shell 會話模式,另一個是非登錄shell 會話模式。
登錄shell 會話模式中會提示用戶輸入用戶名和密碼;非登錄shell 會話模式通常在GUI下啟動終端會話時出現。
登錄shell 會話模式下啟動文件內容:
非登錄shell 會話模式下啟動文件內容:
修改linux shell環境
依據通常的操作思路,通過添加目錄到PATH 變數或定義新的環境變數,再把這些更改存放至.bash_profile 文件中;那麼對於其它的更改呢,需要存放至.bashrc 文件中。
除了系統管理員具將系統中的所有用戶修改默認設置的許可權外,其他用戶只能限定對個人家目錄下的文件進行修改。
我們通過使用一個叫做文本編輯器的程序來編輯(或讀、寫)shell 的啟動文件以及其它配置文件。文本編輯器是一個類似於文字處理器的程序,允許使用移動游標在屏幕上編輯。但不同之處在於文本編輯器不僅支持純文本,而且常包含為便於寫程序而設計的特性。由此可見,文本編輯器是開發人員用來寫代碼,以及系統管理員用來管理控制系統的配置文件的重要工具之一。
文本編輯器通常分為兩種基本類型:圖形化的和非圖形化的(基於文本)編輯器。
一些典型的圖形化編輯器有GNOME 和KDE。GNOME編輯器自帶了gedit 的編輯器,它通常在GNOME 菜單中稱為「文本編輯器」。KDE自帶了三種編輯器,分別是kedit,kwrite,kate。
那麼基於文本的編輯器有nano、vi 和emacs。
nano 編輯器是一個簡單易用的編輯器。vi 編輯器(目前已被vim (「Vi IMproved」 的簡寫)替代)是類Unix 操作系統的傳統編輯器。emacs 編輯器屬於龐大的、多用途的,可做任何操作的編程環境。
無論哪種類型的文本編輯器都可以在命令行中輸入編輯器的名字及想要編輯的文件名,執行文本編輯操作。在這篇文章中,我們學到了用文本編輯器來編輯配置文件的基本技巧。
這篇文章主要討論了linux SHELL環境的一些基礎知識及基本的操作技巧。在編寫這篇文章過程中我還參考了 《Linux就該這么學(第2版)》 這本書,基於紅帽8編寫,內容很貼近實踐,很有理論指導實踐價值的一本書籍。
㈦ 什麼是Linux的登錄shell與非登錄shell
Linux的登錄shell與非登錄shell的含義及區別:
1、含義:登錄shell,指的是當用戶登錄系統時所取的那個shell,登錄shell屬於互動式shell。
登錄shell將查找4個不同的啟動文件來處理其中的命令,用戶登錄後,在終端上輸入命令,shell立即執行用戶提交的命令,當用戶退出後,shell也終止了。
非互動式:即shell與用戶不存在交互,而是以shellscript的方式執行的,shell讀取存放在文件中的命令,並且執行它們。當它讀到文件的結尾EOF,shell也就終止了。
2、完整度不同:如果啟動了一個bash shell而沒有登入系統(如在CLI提示符中鍵入bash),則啟動了一個互動式非登錄shell。
互動式非登錄shell執行/bashrc文件中的命令,在每次執行shell腳本時,都會重新讀取這個文件,所以是最完整的。
3、使用情況不同:登錄shell的初始化文件(比如.bash_profile)通常會運行這個文件。這樣,登錄shell和非登錄shell都可以使用.bashrc中的命令。
4、登陸方式不同:登錄 shell 需要用戶名、密碼登錄後進入的 shell,或者通過--login選項生成的 shell 。
非登錄 shell 是指不需要輸入用戶名和密碼即可打開的 shell,比如輸入命令bash或者sh就能進入一個全新的非登錄 shell,在 Gnome 或 KDE 中打開一個 「terminal」 窗口,也是一個非登錄 shell。
5、數值不同:
查看$0的值,登錄shell返回-bash,而非登錄shell返回的是bash。
需要注意的是:執行exit命令,退出的shell可以是登錄或者非登錄shell;執行logout命令,則只能退出登錄shell,不能退出非登錄shell。
(7)linux系統shell擴展閱讀:
登陸shell通常指的是:
1、用戶通過輸入用戶名/密碼(或證書認證)後啟動的shell;
2、通過帶有-l|--login參數的bash命令啟動的shell。
例如,系統啟動、遠程登錄、使用su-切換用戶、通過bash--login命令啟動bash等。
而其他情況啟動的shell基本上就都是「非登陸shell」了。
例如,從圖形界面啟動終端、使用su切換用戶、通過bash命令啟動bash等。
㈧ shell與Linux命令的區別是什麼
眾所周知,shell是運行在Linux系統上的一個腳本語言,是每個運維人員必須掌握的知識;而我們在使用Linux系統的時候,必須通過命令來操作,那麼shell腳本語言與Linux命令有什麼聯系?它們之間的區別是什麼?這篇文章為大家講解一下。
shell翻譯成殼的意思,它是包裹在Linux內核外層的,一個可通過一系列的Linux命令對操作系統發出相關指令的人機界面。shell可以通過其條件語句和循環語句等,把一系列Linux命令結合在一起,形成一個相當於面向過程的程序,即shell
script,從而實現一些復雜的功能。
shell可以說是Linux命令集的概稱,屬於命令行的人機界面。shell是一個用C語言編寫的程序,它是用戶使用Linux的橋梁。shell既是一個命令語言,也是一個程序設計語言;其次,shell也指一種應用程序,這個應用程序提供了一個界面,用戶通過這個界面訪問操作系統內核的服務。
由此可見,shell相當於經過裝飾的命令行,它與命令行一樣,都能操作Linux;但是shell是面向過程的,相當於有了一定的邏輯和過程,而命令行只是單一的操作。
shell與Linux命令的區別
1、直接在命令行執行,就是在當前的shell環境下執行,比如涉及到一些環境變數的時候,必須在當前shell環境里執行。
2、在腳本執行的話,會fork一個子進程,所有操作都在子進程中進行。如果涉及到一些在腳本里設置環境變數的東西,腳本結束了,環境變數就消失了,如果是修改環境變數的話,需要特別注意。
3、shell可以重復或批量地進行一些命令,你也可以把自己要重復執行的命令寫到腳本裡面執行,而命令行的話就需要一個一個的輸入命令,比較麻煩。
㈨ linux下的shell是什麼
什麼是shell
shell是用戶和Linux
操作系統
之間的
介面
。Linux中有多種shell,其中預設使用的是Bash。本章講述了shell的工作原理,shell的種類,shell的一般操作及Bash的
特性
。
什麼是shell
Linux系統的shell作為操作系統的
外殼
,為用戶提供使用操作系統的介面。它是
命令語言
、命令
解釋程序
及
程序設計語言
的統稱。
shell是用戶和
Linux內核
之間的介面
程序
,如果把Linux內核想像成一個
球體
的中心,shell就是圍繞
內核
的外層。當從shell或其他程序向Linux傳遞命令時,內核會做出相應的反應。
shell是一個命令語言
解釋器
,它擁有自己內建的shell命令集,shell也能被系統中其他
應用程序
所調用。用戶在提示符下輸入的命令都由shell先解釋然後傳給Linux核心。
Shell是一種具備
特殊功能
的程序,
它是介於使用者和
UNIX/linux
操作系統之核心
程序(kernel)間的一個介面。為什麼我們說
shell
是一種介於系統核心程序與使用者
間的中介者呢?讀過操作系統概論的讀者們都知道操作系統是一個
系統資源
的管理者與分
配者,當您有需求時,您得向系統提出;從操作系統的角度來看,它也必須防止使用者因
為錯誤的操作而造成系統的傷害?眾所周知,對
計算機
下命令得透過命令(command)
或
是程序(program);程序有編譯器(compiler)將程序轉為
二進制代碼
,可是命令呢?
其實shell
也是一支程序,它由
輸入設備
讀取命令,再將其轉為計算機可以了解的機械碼,
然後執行它。
各種操作系統都有它自己的
shell,以
DOS
為例,它的
shell
就是
command.com文
件。如同
DOS
下有
NDOS,4DOS,DRDOS
等不同的命令解譯程序可以取代標準的
command.com
,UNIX
下除了
Bourne
shell(/bin/sh)
外還有
C
shell(/bin/csh)、
Korn
shell(/bin/ksh)、Bourne
again
shell(/bin/bash)、Tenex
C
shell(tcsh)
等其它的
shell。UNIX/linux將
shell
獨立於核心程序之外,
使得它就如同一般的應用
程序,
可以在不影響操作系統本身的情況下進行修改、更新版本或是添加新的功能。
有一些命令,比如改變工作目錄命令cd,是包含在shell
內部
的。還有一些命令,例如
拷貝
命令cp和移動命令rm,是存在於
文件系統
中某個目錄下的單獨的程序。對用戶而言,不必關心一個命令是建立在shell內部還是一個單獨的程序。
shell首先檢查命令是否是
內部命令
,若不是再檢查是否是一個應用程序(這里的應用程序可以是Linux本身的
實用程序
,如ls和rm,也可以是購買的商業程序,如xv,或者是
自由軟體
,如emacs)。然後shell在搜索
路徑
里尋找這些應用程序(搜索路徑就是一個能找到可執行程序的目錄列表)。如果鍵入的命令不是一個內部命令並且在路徑里沒有找到這個
可執行文件
,將會顯示一條錯誤信息。如果能夠成功找到命令,該內部命令或應用程序將被分解為
系統調用
並傳給Linux內核。
shell的另一個重要特性是它自身就是一個解釋型的程序設計語言,shell程序設計語言支持絕大多數在
高級語言
中能見到的程序
元素
,如
函數
、
變數
、
數組
和程序控制結構。shell
編程語言
簡單易學,任何在提示符中能鍵入的命令都能放到一個可執行的shell程序中。
當普通用戶成功登錄,系統將執行一個稱為shell的程序。正是shell進程提供了命令行提示符。作為默認值(TurboLinux系統默認的shell是BASH),對普通用戶用「$」作提示符,對超級用戶(root)用「#」作提示符。
一旦出現了shell提示符,就可以鍵入
命令名稱
及命令所需要的
參數
。shell將執行這些命令。如果一條命令花費了很長的時間來運行,或者在屏幕上產生了大量的輸出,可以從
鍵盤
上按ctrl+c發出中斷
信號
來中斷它(在正常結束之前,中止它的執行)。
當用戶准備結束登錄對話進程時,可以鍵入logout命令、exit命令或文件結束符(EOF)(按ctrl+d實現),結束登錄。