2021-05-12 14:32:11
Linux之bash shell特性
一、shell是什麼?
Shell 本身是一個用C語言編寫的程式,它是使用者使用Unix/Linux的橋樑,使用者的大部分工作都是通過Shell完成的。Shell既是一種命令語言,又是一種程式設計語言。作為命令語言,它互動式地解釋和執行使用者輸入的命令;作為程式設計語言,它定義了各種變數和引數,並提供了許多在高階語言中才具有的控制結構,包括迴圈和分支。
如圖shell是一個應用程式,是使用者管理應用程式的一個介面。
二、廣義上shell的分類
GUI:圖形化使用者介面
KDE,GNOME,XFCE
CLI:命令列介面
bash, zsh, fishsh, csh, tcsh, ksh
在大多發行版中常用的為bash
三、bash的特性
bash是弱型別的程式語言,不嚴格區分資料型別,意味把所有資料統統當作字串處理;
字串型別的資料可不加引號;
引號有三種型別:', ", `
', ":字元參照
': 強參照,其內部的變數不會被替換;
":弱參照,其內部的變數會被替換;
`:命令參照
變數參照:${NAME}
a、bash特性之一:快捷鍵
ctrl + ? 撤消前一次輸入 ctrl + c 另起一行 ctrl + r 輸入單詞搜尋歷史命令 刪除 ctrl + d 刪除游標所在位置上的字元相當於VIM裡x或者dl ctrl + h 刪除游標所在位置前的字元相當於VIM裡hx或者dh ctrl + k 刪除游標後面所有字元相當於VIM裡d shift+$ ctrl + u 刪除游標前面所有字元相當於VIM裡d shift+^ ctrl + w 刪除游標前一個單詞相當於VIM裡db ctrl + y 恢復ctrl+u上次執行時刪除的字元 ctrl + ? 撤消前一次輸入 alt + r 撤消前一次動作 alt + d 刪除游標所在位置的後單詞 移動 ctrl + a 將游標移動到命令列開頭相當於VIM裡shift+^ ctrl + e 將游標移動到命令列結尾處相當於VIM裡shift+$ ctrl + f 游標向後移動一個字元相當於VIM裡l ctrl + b 游標向前移動一個字元相當於VIM裡h ctrl + 方向鍵左鍵 游標移動到前一個單詞開頭 ctrl + 方向鍵右鍵 游標移動到後一個單詞結尾 ctrl + x 在上次游標所在字元和當前游標所在字元之間跳轉 alt + f 跳到游標所在位置單詞尾部 替換 ctrl + t 將游標當前字元與前面一個字元替換 alt + t 交換兩個游標當前所處位置單詞和游標前一個單詞 alt + u 把游標當前位置單詞變為大寫 alt + l 把游標當前位置單詞變為小寫 alt + c 把游標當前位置單詞頭一個字母變為大寫 ^oldstr^newstr 替換前一次命令中字串 歷史命令編輯 ctrl + p 返回上一次輸入命令字元 ctrl + r 輸入單詞搜尋歷史命令 alt + p 輸入字元查詢與字元相接近的歷史命令 alt + > 返回上一次執行命令 其它 ctrl + s 鎖住終端 ctrl + q 解鎖終端 ctrl + l 清屏相當於命令clear ctrl + c 中止當前命令 ctrl + d 後台執行(等同於命令後面接&) ctrl + i 類似TAB健補全功能 ctrl + o 重複執行命令 alt + 數位鍵 操作的次數 Esc-b 左移一個單詞 Esc-f 右移一個單詞 ctrl+s : 鎖住螢幕 ctrl+q : 恢復螢幕
b、bash的特性之二:命令歷史
shell進程會儲存其對談中使用者曾經執行過的命令;命令通過其“歷史檔案”來持久儲存此前執行過的命令;每個使用者都有其自己專用的歷史檔案;
HISTSIZE:shell進程的緩衝區保留的歷史命令的條數;
HISTFILESIZE:命令歷史檔案可儲存的歷史命令的條數;
HOSTTIMEFORMAT:歷史命令加時間戳,用於審計;
HISTIGNORE="str1:str2:…"忽略string1,string2歷史;
#export HISTTIMEFORMAT="%F %T" ... 358 2016-12-28 04:12:34 man split 359 2016-12-28 04:14:29 cd 360 2016-12-28 04:14:34 vim .bash_history 361 2016-12-28 04:22:39 history
預設均為1000;
# echo $HISTSIZE 1000 # echo $HISTFILESIZE 1000
HISTFILE:當前使用者的命令歷史檔案;
~/.bash_history
檢視命令歷史列表:
# history
命令用法:
history -c:清空命令歷史;
history -d OFFSET:刪除指定的條目;
# history -d 156
-a:將當前緩衝的歷史行追加到歷史檔案中
-n:從歷史檔案中讀取所有未被讀取的行
-r:讀取歷史檔案並將內容追加到歷史列表中
-w:儲存歷史列表到指定的歷史檔案
-s: 展開歷史引數成一行,附加在歷史列表後(偽造歷史命令)
呼叫命令歷史列表中的命令以重執行之目的:
!#:再一次執行歷史列表中的第#條命令;
# history .... 72 cat test 73 history # !72 cat test Hello World
!!:再一次執行上一條命令;
# cat test Hello World # !! cat test Hello World
!STRING:再一次執行命令歷史列表中最近一個以指定的STRING開頭的命令;
# !cat cat test Hello World
顯示最近的n條件命令歷史:
history #
控制命令歷史的記錄方式:
通過HISTCONTROL環境變數進行,其取值:
ignoredups:忽略重複的命令;重複是指連續且相同的令;
ignorespace:以空白字元開頭的命令不記入歷史;
ignoreboth:上述兩者同時生效;
erasedups:刪除重複命令;
修改變數值的方式:
NAME='VALUE' # echo $HISTCONTROL ignoredups # HISTCONTROL="ignoreboth" # echo $HISTCONTROL ignoreboth
永久生效存放位置:
存放在 /etc/profile 或 ~/.bash_profile或/etc/profile.d/*.sh
歷史命令引數呼叫:
呼叫上一條命令的最後一個引數: 快捷鍵:ESC, . Alt+. !$:給出的字元組合 #cmd !^ : 利用上一個命令的第一個引數做cmd的引數 #cmd !$ : 利用上一個命令的最後一個引數做cmd的引數 #cmd !* : 利用上一個命令的全部引數做cmd的引數 #cmd !:n : 利用上一個命令的第n個引數做cmd的引數 !n:^ 呼叫第n條命令的第一個引數 !n:$ 呼叫第n條命令的最後一個引數 !m:n 呼叫第m條命令的第n個引數 !n:* 呼叫第n條命令的所有引數 !string:^ 從命令歷史中搜尋以 string 開頭的命令,並獲取 它的第一個引數 !string:$ 從命令歷史中搜尋以 string 開頭的命令,並獲取它 的最後一個引數 !string:n 從命令歷史中搜尋以 string 開頭的命令,並獲取 它的第n個引數 !string:* 從命令歷史中搜尋以 string 開頭的命令,並獲取 它的所有引數
c、bash的特性之三:內外部命令和命令路徑補全
命令補全:
shell程式在接收到使用者執行命令的請求且分析完成之後,最左側字串將被當作命令去查詢;
查詢機制:
(1) 查詢內部命令;
(2) 查詢快取在記憶體中的外部命令;
(3) 查詢外部命令:
1、去$PATH變數所指定的各路徑下,自左而右逐個搜尋各目錄下的檔名;
2、給定的打頭的字串如果能惟一標識某命令程式檔案的檔名,則直接補全;
3、不能惟一標識,再擊tab可給列表;
4、錯誤:沒有任何命令可被此打頭字串標識;
type命令用來檢視內部外部命令
enable命令:
#enable -n cd 禁用內部命令 #enable cd 啟用內部命令
使用which或者where檢視命令所在的路徑
hash命令:
搜尋到的外部命令路徑結果快取至kv(key-value)儲存中
hash 顯示hash快取 hash –r
清除快取,hash -d COMMAND
清空制定的命令
#which --skip-alias cd /usr/bin/cd
路徑補全:
在給定的起始路徑的上級目錄下,以對應路徑下的打頭字串來逐一匹配上級目標下的每個檔案:
惟一標識:tab補全;
不能惟一標識:tab, tab給出列表;
錯誤路徑:沒有響應;
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2017-02/140320p2.htm
相關文章