Shell:對於Linux來說一種應用程序,在庫調用和系統調用之上可以保護操作系統。
shell分爲兩類:
圖形界面shell(GUIshell,Graphical User Interface shell)
命令行界面shell(CLIshell,Command Line Interface shell)
**********************************************************************************
shell發展:
Bourne Shell
首個重要的標準Unix Shell是1970年底在V7 Unix(AT&T第7版)中引入的,並且以它的創始科技部基礎條件平臺“國家氣象網絡計算應用節點建設”(2004DKA50730)資助者Stephen Bourne的名字命名。Bourne shell 是一個交換式的命令解釋器和命令編程語言。Bourne shell 可以運行爲login shell或者login shell的子shell(subshell)。只有login命令可以調用Bourne shell作爲一個login shell。此時,shell先讀取/etc/profile文件和$HOME/.profile文件。/etc/profile文件爲所有的用戶定製環境,$HOME/.profile文件爲本用戶定製環境。最後,shell會等待讀取你的輸入。
C Shell
Bill Joy於20世紀80年代早期,在Berkeley的加利福尼亞大學開發了C shell。它主要是爲了讓用戶更容易的使用交互式功能,並把ALGOL風格的語法結構變成了C語言風格。它新增了命令歷史、別名、文件名替換、作業控制等功能。
Korn Shell
有很長一段時間,只有兩類shell供人們選擇,Bourne shell用來編程,C shell用來交互。爲了改變這種狀況,AT&T的bell實驗室David Korn開發了Korn shell。ksh結合了所有的C shell的交互式特性,並融入了Bourne shell的語法。因此,Korn shell廣受用戶的歡迎。它還新增了數學計算,進程協作(coprocess)、行內編輯(inline editing)等功能。Korn Shell 是一個交互式的命令解釋器和命令編程語言.它符合POSIX——一個操作系統的國際標準.POSIX不是一個操作系統,而是一個目標在於應用程序的移植性的標準——在源程序一級跨越多種平臺。
Bourne Again Shell (bash)
bash是GNU計劃的一部分,用來替代Bourne shell。它用於基於GNU的系統如Linux.大多數的Linux(Red Hat,Slackware,Caldera)都以bash作爲缺省的shell,並且運行sh時,其實調用的是bash。
POSIX Shell
POSIX shell 是Korn shell的一個變種. 當前提供POSIX shell的最大賣主是Hewlett-Packard。在HP-UX 11.0,POSIX shell 就是/bin/sh,而bsh是/usr/old/bin/sh.
-----------------------------------引自《搜狗百科》
Zsh(Zshell),功能很強大,是最接近所有shell集合的shell
*************************************************************************************
在我們的/etc/shells下可以查看系統支持的shell。當前系統使用的shell可以用echo $0查看,用cat /etc/shells查看的shell可以直接當作命令。
注意:
a)nologin不能隨便使用。
b)在每一次換shell中,最好返回到bash。可以用exit退出當前shell。
bash:
一、別名的替換 ----> alias 別名=‘命令’
alias是集成在bash中的
alias [-p] [名稱[=值] ... ] 定義或顯示別名。
alias命令是顯示已定義的別名
unalias: 用法:unalias [-a] 名稱 [名稱 ...] 從別名定義中刪除每一個"名字"
*注意:如果註銷系統,則使用alias和unalias定義的別名將失去作用,解決方案是將命令寫入文件當中,在用戶的家目錄中的一個隱藏文件,文件名爲".bashrc",其主要功能就是用來保存命令的別名的定義.
*注意:在對於此文件中的命令別名進行編輯並保存之後,在當前已經運行的bash中並不會立即生效,需要重新加載此文件才能使配置生效,以下兩種操作皆可實現:
1.重啓bash:註銷之後再次登錄即可;
2.執行文件中定義的命令:使用source命令,或者.命令;
source或者.
source : 在當前 shell 中執行一個文件中的命令。
. :在當前 shell 中執行一個文件中的命令。
格式:source或者. 文件名 [參數]
二、bash的快捷鍵:
C:Ctrl鍵
M:Alt鍵
E:ESC鍵
DEL:Backspace鍵
C-l:清屏,相當於clear命令;
C-a:將光標跳轉至命令行編輯模式的行首;
C-e:將光標跳轉至命令行編輯模式的行尾;
C-k:刪除命令行編輯模式的光標所在位置至行尾的內容;
C-u:刪除命令行編輯模式的光標所在位置至行首的內容;
C-c:結束前臺進程;
M-.:引用上一個命令中的最後一個參數;(在Xshell中不能用)
E,.:功能同M-.
三、命令歷史:
Bash進程會保存其會話中的用戶曾經執行過的命令,以方便用戶重複執行某個命令操作;
命令歷史包括兩個方面:
1.用戶曾經執行過的命令;
2.用戶曾經執行過的命令的路徑;
在Bash中有一個內置的變量——PATH,PATH變量的值爲當前系統中所有的命令的文件所在的路徑的集合;
命令如何被shell執行的?
bash會將命令行的內容按照空白字符進行切片,分析第一個切片內容:
1.判斷第一個切片的內容是內部命令還是外部命令;
如果是內部命令,直接運行;
如果是外部命令,先找hash表中的路徑緩存,如果有,則直接執行;否則通過查找PATH變量中包含路徑中,是否有對應名稱的文件;
使用hash命令查看被記住的命令文件的路徑;
-r:清空hash表;
使用history命令查看被記住的命令的命令行參數;
history - 顯示或操縱歷史列表。
格式: history [-c] [-d 偏移量] [n] 或 history -anrw [文件名] 或 history -ps 參數 [參數...]
常用選項:
-c:清空歷史緩衝區中的命令歷史記錄;
-d OFFSET:刪除指定的歷史命令條目;
重複執行歷史緩衝區中的命令:
!NUMBER:重複執行歷史緩衝區中編號爲"NUMBER"的命令;
!STRING:重複執行歷史緩衝區中以"STRING"開頭的最後一次執行過的命令;
!?STRING:重複執行歷史緩衝區中包含了"STRING"的最後一次執行過的命令;
!-NUMBER:重複執行歷史緩衝區中倒數第"NUMBER"條命令;
使用上、下Arrow可以從歷史緩衝區中調用命令,回車之後執行;
C-r:在歷史緩衝區中實施搜索,回車之後執行;
!$:在歷史緩衝區中調用最後一個命令的最後一個參數;
!^:在歷史緩衝區中調用最後一個命令的第一個位置的參數;
!:NUMBER:在歷史緩衝區中調用最後一個命令的第"NUMBER"位置參數
!SEQUENCE:NUMBER:歷史緩衝區中調用第"SEQUENCE"條命令的第"NUMBER"位置參數
在bash中與命令歷史相關的內置變量:
HISTSIZE:歷史緩衝區中能夠保存的命令歷史的最大條目數量,默認值爲1000;
HISTFILESIZE:~/.bash_history文件中能夠保存的命令歷史的最大條目數量,默認值爲1000;
HISTTIMEFORMAT:在命令歷史緩衝區中記錄歷史命令時,同時記錄命令的執行的時間戳標記;可以使用date命令的FORMAT來表示時間的記錄格式;默認值爲空;
HISTCONTROL:控制命令歷史的記錄方式:
ignoredups:連續且相同的命令不會被記錄到歷史緩衝區;此爲默認值;
ignorespace:以空白字符開頭的命令不會被記錄到歷史緩衝區;
ignoreboth:上述兩種情況都不會被記錄到歷史緩衝區;
四、命令補全——(TAB鍵的使用)
包括兩個方面的內容:
1.構成命令字符串的補全;
參考PATH變量中的路徑,對命令進行補全:
如果,給出的字符串在PATH變量對應的路徑中是唯一的,則直接補全命令;
如果,給出的字符串在PATH變量對應的路徑中不唯一,則bash給出提示;
2.命令中參數所對應的字符串補全;
根據給出的路徑進行補全:
如果,給出的字符串在給出的路徑中是唯一的,則直接補全參數;
如果,給出的字符串在給出的路徑中不唯一,則bash給出提示;
五、命令行展開
(a+b+c)(d+e+f)=ad+ae+af+bd+be+bf+cd+ce+cf
1.~展開:
~:bash會自動將其展開爲當前登錄用戶的家目錄;
~STRING:bash會自動將其展開爲以"STRING"爲用戶名的用戶的家目錄;
~+:調用bash的內置變量"PWD"的值;
~-:調用bash的內置變量"OLDPWD"的值;
2.{}展開:
在"{}"中,可以填充一個以","分隔的路徑列表,bash會將其展開爲多個獨立的路徑;
六、命令的執行結果
在bash中,命令的執行結果有兩種:
1.執行命令的輸出結果:
根據用戶的需求獲取到的命令執行的正常輸出結果;
命令引用或命令替換:
`` 相當於 $()
``:反向單引號,反引號;
2.執行命令的狀態返回值:
與此前的一個命令是否成功執行相關的返回內容;
bash使用一個特殊的內置變量來保存其內容:$?
$?實際上保存的是一個數值,其取值範圍:0-255
其中:
0:表示命令執行成功;
1-255:表示命令執行失敗;
1,2,127:bash中內置的命令執行失敗的狀態返回值;
1:表示小問題;
2:表示嚴重問題;
127:表示命令本身出現問題;
其餘數字(3-126,128-255):用戶可以自定義的失敗狀態返回值;
七、引用功能:
'':強引用
凡是被單引號引用的內容,bash在處理時,一律視其爲普通字符,即使其本身是bash定義的具有特殊功能和作用字符亦是如此,但單引號本身除外;
"":弱引用
被雙引號引用的內容中,有些特殊字符仍然會保留其特殊含義,如: $, \, "";
八、轉義功能:
\:bash定義的轉義字符;大多數的情況下,"\"只能將其後面一個字符轉義;
\COMMAND:取消定義過的命令別名,而使用命令本身的功能;
九、Globbing——文件名通配符,簡稱爲glob;
*:匹配任意長度的任意字符或字符串;(某些特殊位置的"."字符不能匹配;)
?:匹配任意單個字符;(某些特殊位置的"."字符不能匹配;)
[]:匹配指定範圍內的任意單個字符,必須匹配且只能匹配一個字符;
指定範圍的方法:
1.枚舉法:列出所有有效字符;
2.範圍指定:
[0-9]:表示所有單個的十進制數字;
[a-z]:a,A,b,B,c,C,...,x,X,y,Y,z
[A-Z]:A,b,B,c,C,...,x,X,y,Y,z,Z
3.bash內建字符集:
[:lower:]:所有的小寫字母
[:upper:]:所有的大寫字母
[:alpha:]:所有字母,包括大小寫;
[:digit:]:所有單個的十進制數字;
[:alnum:]:所有的字母和十進制數字;
[:punct:]:所有的符號;
[:space:]:表示空白字符,包括空格和製表符;
4.反向匹配:
注意:當中括號中有"^"表示字符集反向匹配時,注意"*"的使用;因爲"*"通配範圍可能會導致反向匹配失敗;此類失敗是因爲bash的globbing是在貪婪模式下匹配的;
管道:|
通常是連接多個命令的,管道符號前面的命令的執行的輸出結果通過管道傳遞給管道符號後面的命令,讓後面的命令將前面命令的輸出結果當成參數使用;
wc:
wc - print newline, word, and byte counts for each file
格式:wc [OPTION]... [FILE]...
常用選項:
-c, --bytes:僅顯示文件中的字節數;
-m, --chars:僅顯示文件中的有效字符的數量;
-l, --lines:僅顯示文件的行數;
-w, --words:僅顯示文件中字的數量;
*注意: 1.一般來講,凡是被管道連接的命令,都應該能夠在執行成功之後完成命令結果的輸出,否則管道無意義;
2.管道不是萬能的,有些場合沒辦法使用管道的;
十一、輸入輸出重定向
在使用計算機的時候,實現某個功能的主體是程序!
程序=指令 + 數據 數據至關重要!!!!
文件,IO——Input/Output
在linux系統中,能夠完成輸入和輸出功能的實體:文件;
可以用於輸入的設備:文件
鍵盤設備、文件系統中的常規文件、網卡設備、聲卡設備、磁盤設備等;
可以用於輸出的設備:文件
顯示器、文件系統中的常規文件、網卡設備、聲卡設備、磁盤設備等;
在內存中使用文件的方式是定義文件描述符,一個文件描述符對應一個文件;
0:表示標準輸入,stdin,從鍵盤實現的輸入數據流;
1:表示標準輸出,stdout,到顯示器的輸出數據流;
2:表示標準錯誤,stderr,到顯示器的錯誤數據流;
輸入輸出重定向(IO重定向)
採用非標準設備文件實現的IO操作;
輸入重定向:
<
輸出重定向:
>:覆蓋輸出重定向;
~]# set -C //開啓防止意外覆蓋源文件開關,可以使用">|"符號完成覆蓋重定向輸出的操作,而無需關心是否開啓此開關;
~]# set +C //關閉防止意外覆蓋源文件開關
>>:追加輸出重定向;
錯誤重定向:
2>:覆蓋錯誤重定向;
2>>:追加錯誤重定向;
合併標準輸出和標準錯誤的重定向:
1.COMMAND {>|>>} /PATH/TO/SOMEFILE 2>&1
2.&>, &>>
bash中的其他特殊符號:
<<:here document,此處文檔,結束標記;
<<<:here string,此處字符串,結束標記;