Shell是一種命令行用戶接口,是一種cli(Command Line Interface) Shell 是Linux系統的用戶界面,提供了用戶與內核進行交互操作的一種接口。它接收用戶輸入的命令並把它送入內核去執行。shell也被稱為LINUX的命令解釋器( command interpreter)shell是一種高級程序設計語言
使用echo ${SHELL}顯示當前使用的shell類型
顯示當前系統支持的所有的shell類型[root@cos68 ~]# cat
/etc/shells
/bin/sh/bin/bash/sbin/nologin/bin/dash/bin/tcsh/bin/csh其中/sbin/nologin表示非登錄用戶使用的shell類型,使用此種shell類型的用戶無法登錄系統,但是可以作為後台服務專用的用戶在機器上運行
使用set命令顯示所有本地定義的Shell變量 PS1這個變量中定義了提示符的值顯示命令提示符的格式echo $PS1
鍵入命令後,回車,shell程序找到鍵入命令所對應的可執行程序或代碼,並由其分析後提交給內核分配資源將其運行起來。
在shell中可執行的命令有兩類:內部命令和外部命令內部命令:是shell內部自帶的命令,系統啟動後,加載對應的shell程序,shell程序被加載後,所有內部命令都會被加載到內存中,bash的文件為/bin/bash,所以如果用戶使用bash登錄,所有內建在/bin/bash中的命令都會在啟動時加載,enable 命令可以啟用或禁用內部命令 外部命令:在當前系統的某文件系統路徑下有對應的可執行程序文件,外部命令在運行的時候加載到內存中,當第一次執行外部命令,會去找到對應的外部命令的文件,加載到內存,當第二次執行同樣的外部命令,就不用再次去找對應的文件,因為已經緩存在內存中,直接從內存執行即可;
使用type命令區別當前使用的命令是內部或外部命令如果是內部命令,返回命令時shell的內建命令#type cdcd is a shell builtin 如果是外部命令,返回命令對應的外部文件#type ifconfigifconfig is /sbin/ifconfig
使用which命令區別當前使用的命令是內部或外部命令which命令會在PATH變量設置的所有路徑中逐個搜索我們要查找的命令,比如,which ifconfig,which就會去path環境變量裡的路徑中逐個尋找ifconfig,path中有多個路徑,那麼which就一個一個找,如果在前面的路徑中找到ifconfig,即使後面的路徑中還有ifconfig,which也會返回前面的,默認設置下which找到第一個就不會再向下找了,如果想要which返回path中所有匹配到的值,而不只是第一個,可以使用which -a ,所以說,如果PATH環境變量中如果配置不同,那麼使用which命令去找同一個命令,結果也有可能不同。 那麼我們使用whichcd 看看有什麼效果[root@cos68 /]# which cd/usr/bin/which: no cd in (/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)返回nocd in,證明使用which沒有找到cd,這是正常現象,因為which是去環境變量裡面找的,而cd命令是shell內建命令,所以找不到才是正常的。 whereis命令是基於程序名搜索的,whereis只搜索二進制文件(使用參數-b)、man說明文件(使用參數-m)和源代碼文件(使用參數-s)如果省略參數,則返回所有信息。whereis查找的速度比find塊,是因為linux會將系統中的文件記錄在數據庫文件中,當使用whereis時,會從數據庫中查找數據。但是該數據庫文件並不是實時更新,默認情況下時一星期更新一次,因此在使用whereis查找文件時,有時會找到已經被刪除的數據,或者剛剛建立文件,卻無法查找到,原因就是因為數據庫文件沒有被更新。 hash命令:命令緩存,顯示已經緩存的外部命令hash -d 命令 刪除指定的已經緩存的外部命令,例:hash -d ifconfighash -r 刪除所有已經緩存的外部命令hash命令只會緩存外部命令,但是,如果以絕對路徑執行外部命令,hash也不會進行緩存,也就是說,如果一個外部命令文件所在位置在path環境變量的路徑中,直接執行這個外部命令,hash會緩存,如果以絕對路徑執行這個外部命令,hash則不會緩存。
當我們鍵入命令後,敲回車,shell會先判斷此命令是否為內部命令,如果是內部命令,直接執行,如果不是內部命令,就去查找內存中外部命令的緩存,如果外部命令的緩存中也沒有這個命令,就去按照PATH環境變量中的路徑順序,逐個路徑中掃描是否有這個外部命令,如果有這個外部命令,則加載到內存中執行,下次再執行同樣的命令,就不用再去查找命令文件了,直接從內存的緩存中即可找到這個外部命令,如果環境變量的路徑中也沒有這個路徑,則報錯。 所以,總上所述,當我們在shell中鍵入一個命令執行的時候,它的查找優先級如下1 是否為內部命令,是:執行; 不是:走第2步2 內存中是否有這個外部命令的緩存,有:執行; 沒有:走第3步3 環境變量中配置的路徑中,是否包含此外部命令,包含:執行; 不包含:報錯 上述shell判斷命令的順序為沒有命令別名的情況,。而如果我們輸入的命令是一個命令別名,那麼這個別名的優先級比內部命令還要高,也就是說,實際上我們鍵入一個命令後,shell判斷這個命令的順序是這樣的1這個命令是否在別名中定義,是:執行; 不是:走第2步2 是否為內部命令,是:執行; 不是:走第3步3內存中是否有這個外部命令的緩存,有:執行; 沒有:走第4步4 環境變量中配置的路徑中,是否包含此外部命令,包含:執行; 不包含:報錯 上面提到命令的別名,我們可以通過alias命令定義和取消定義別名alias命令別名alias CMDALIAS='CMD [OPTIONS] [ARGUMENTS]'例如將clear命名為clsalias cls='clear'但是,這樣重命名只對當前bash有效,如果想讓別名永久生效,需要修改bash的配置文件/etc/bashrc或者~/.bashrc,修個這兩個文件的區別在於前者是系統全局設置,設置完成後所有用戶生效,後者是某個用戶家目錄中的設置,只對設置的用戶有效。 如果想將當前bash的別名取消。使用unalias即可例如 unaliascls 如果別名與原名一樣,使用\CMD,使用源命令,反斜槓加源命令即可執行原命令如果別名與原名一樣,除了在別名前加\以外,還可以直接單引號,例如'CMD'
命令替換$(command) 或者使用反引號 `command`把命令中某個子命令替換為其執行結果的過程。例如echo"lalala $(date)"輸出則為lalala當前時間,注意,上述命令使用單引號則不行,需要使用雙引號 bash支持的引號:``:反引號,用於命令替換,與$() 效果相同,命令引用"":雙引號,弱引用,可以實現變量替換'':單引號,強引用,不完成變量替換
在使用bash的時候有一些快捷鍵 多個命令可以用;符號分開 一個命令可以用\分成多行,命令轉行,命令強制轉行 光標跳轉:ctrl +a: 跳轉命令行首ctrl+e:跳到命令行尾ctrl+u:刪除光標至命令行首的內容ctrl+k:刪除光標至命令行尾的內容 在圖形界面的終端中,使用ctrl +左右方向鍵 支持快速跳到前一個單詞或者後一個單詞,但是只是在圖形界面的 清楚屏幕ctrl+l或者clear arrow ctrl-b ctrl-f會向左或向右移動一個字符Esc-b 左移一個單詞Esc-f 右移一個單詞
馬哥教育Linux學習筆記
http://www.magedu.com/http://mageedu.blog.51cto.com
.
本文出自 “學思行知” 博客,請務必保留此出處http://zz6547.blog.51cto.com/2571551/1829611