linux基礎之bash特性
linux基礎之bash特性
1、命令歷史
命令歷史包含的環境變量
$HISTSIZE:命令歷史記錄的條數
$HISTFILE:命令歷史文件~/.bash_history
$HISTFILESIZE:命令歷史文件記錄歷史命令的條數
$HISTCONTROL:控制命令歷史的記錄方式
關於這個$HISTCONTROL環境變量值的介紹:
ignoredups:設置為這個值時,忽略重復的命令記錄到命令歷史中,這重復的命令必須是連續的,也就是挨著的($HISTCONTROL默認是ignoredups這個值)
如何設置:
export HISTCONTROL=”ignoredups”
ignorespace:設置為這個值時,忽略所有以空白字符開頭的命令記錄到命令歷史中
如何設置:
export HISTCONTROL=”ignorespace”
ignoreboth:設置為這個值時,上面兩個之所對應的功能都生效
如何設置:
export HISTCONTROL=”ignoreboth”
命令歷史的使用
history -d num :清除命令歷史記錄中指定的命令歷史編碼數
history -c:清除所有命令歷史記錄
histroy num:顯示歷史命令記錄中最近
history -a:手動追加當前會話命令歷史緩沖區的命令到命令歷史文件
命令歷史的快捷鍵
!!:調用上一次使用的命令
!+num:調用歷史命令記錄中編號為num的命令
!+string:調用命令歷史記錄中最近一次使用的以string為開頭的命令
!+$:調用上一條命令的最後一個參數的快捷鍵
ESC+ . :調用上一條命令的最後一個參數的快捷鍵,按鍵盤上ESC鍵,松開後再按點號
ALT+ . :調用上一條命令的最後一個參數的快捷鍵,按鍵盤上ALT鍵,不松開接著按點號(可能有些不管用)
2、命令補全
命令補全使用方式:當我敲擊一個命令時,可以寫前幾個字符,然後使用tab鍵補全
命令補全的實現機制:bash根據PATH環境變量定義的路徑,自左向右的在每個路徑下搜索以給定字符為開頭的對應的命名二進制可執行文件,如果找尋了所有路徑只包含一個,那麽直接補全,如果包含多個,那麽在使用一次tab鍵,打印給定字符包含的所有可執行命令
bash執行命令過程
外部命令:bash根據PATH環境變量定義的路徑,自左向右的在每個路徑下搜索以給定命令命名二進制可執行文件,第一次找到即為要執行的命令
3、路徑補全
路徑補全的實現機制:把用戶給出的字符串當做路徑的開頭,並在其指定上級目錄下搜索以指定的字符串開頭的文件名,如果唯一則按tab鍵補全路徑,如果不唯一則需要再按一下tab鍵,此時會列出以這個字符串開頭的所對應的文件列表。
註意:他還有一個特殊的機制,那就是當我們給定的字符串搜索時,如果這個目錄下的所有文件包含這個字符串,同時還包含了其他相同字符,那麽再按一下tab鍵會補全到所有相同字符串的位置
4、命令行展開
~:展開為用戶的家目錄
使用案例
[root@oldboy ~]# cd ~oldboy [root@oldboy oldboy]# pwd /home/oldboy
{}:可承載一個以逗號分割的列表,並將其展開為多個路徑
使用方式
/tmp/{a,b} 展開為 /tmp/a /tmp/b
/tmp/{tom,jerry}/ha 展開為 /tmp/tom/ha /tmp/jerry/ha
5、命令執行結果狀態
命令執行後的結果無非兩種,成功或者失敗,bash使用特殊變量$?保存最近一條命令執行的狀態結果
狀態碼
0:表示成功
1-255:表示失敗
程序的執行有兩類結果
一類是:程序的返回值
另一類是:程序的執行狀態結果
6、命令別名-alias
基本介紹
命令取的另外一個名字,我們可以把很長的命令格式,通過一個別名,把它簡化為一個簡短的名字。
基本用法
alias [-p] [name[=value] ... ]
常用參數
-p:打印所有定義的別名
使用註意
alias命令是一個內建命令,如果alias不帶任何參數或者選項表示列出所有的別名,如果要定義別名使用alias 命令簡寫=”命令長格式”
在命令行定義的別名僅對當前shell進程有效。如果想永久有效,需要定義在配置文件中
配置文件有兩種:
僅對當前用戶有效
~/.bashrc
對所有用戶有效
/etc/bashrc
任何修改配置文件,只能被新進程或者讓新進程重新讀取才生效(這裏的進程指的是bash進程)
讓bash進程重新讀取使用source命令
source 配置文件
. 配置文件
註:新配置的配置文件不會立刻生效,需讓bash進程重新讀取才會生效
撤銷別名:unalias
unalias 別名 :撤銷指定別名
unalias -a:撤效全部定義的別名
註意:如果不想使用別名,但是又不想去除別名定義,那麽可以在使用別名前加一個反斜線[ \ ],或者補全命令的全路徑
7、Glob
基本介紹
bash中用於實現文件名通配
基本使用
通配符
*
基本介紹
匹配任意長度的任意字符
基本使用
a*c 表示 a111c,asdc,ac等,但是不表示acb
?
基本介紹
匹配任意單個字符,必須包含單個字符
基本使用
a?b 表示 acb,adb等,但是不表示adbc,acnb,ab
[]
基本介紹
匹配指定範圍內的任意單個字符,如果範圍內是小寫字母,那麽是不區分大小寫的,如果範圍內是大寫,那麽只是取大寫範圍。
註意:如果要匹配連字符[ - ],那麽要使用轉義符號
案例演示
a[\-cv]b 表示匹配 a-b,acb,avb等
基本使用
[abc] 表示 a,b,c等,但不表示ab,ac,abc等
a[a-z]c 表示 aCc,acc,aDc,adc等
[^]
基本介紹
匹配指定範圍之外的任意字符
基本使用
a[^0-9] 表示 ab,a^,a@等,不表示a1,a2等
專用字符集合表示法
[:digit:]:任意數字相當於0-9,這裏只表示數字,不是匹配數字,匹配數字要寫成[[:digit:]]
[:lower:]:任意的小寫字母,這裏只表示小寫字母,不是匹配小寫字母,匹配小寫字母要寫成[[:lower:]]
[:upper:]:任意的大寫字母,這裏只表示大寫字母,不是匹配大寫字母,匹配大寫字母要寫成[[:upper:]]
[:alpha:]:任意的大小寫字母,這裏只表示大小寫字母,不是匹配大小寫字母,匹配大小寫字母要寫成[[:alpha:]]
[:alnum:]:任意的數字和字母,這裏只表示數字和大小寫字母,不是匹配數字和大小寫字母,匹配數字和大小寫字母要寫成[[:alnum:]]
[:space:]:任意的空格,這裏只表示空格,不是匹配空格,匹配空格要寫成[[:space:]]
[:punct:]:任意的標點字符,這裏只表示標點符號,不是匹配標點符號,匹配空格要寫成[[:punct:]]
案例演示
列出/var目錄下,非字母開頭,後面跟任意單個字母的txt文件
ls -l /var/[^[:alpha:]][[:alpha:]].txt
8、bash的快捷鍵
ctrl+l:清屏操作,相當於clear命令
ctrl+a:將光標跳轉至命令的首部
ctrl+e:將光標跳轉至命令的尾部
ctrl+c:取消命令執行
ctrl+u:刪除光標所在位置之前的全部字符
ctrl+k:刪除光標所在位置之後的全部字符
9、輸入、輸出重定向及管道
程序是由指令加數據組成,那麽程序都有讀入數據的需求(Input),程序也有輸出數據的需求(Output)
程序讀入數據的來源有很多:文件、用戶鍵盤輸入等
程序輸出數據的地方有很多:保存至文件、輸出到屏幕等
那麽程序讀入數據或者輸出數據的選擇就有很多,如果程序每一次執行時都需要指定程序讀入數據或者輸出數據的來源或者去處,這樣會很麻煩,因此,就會有缺省或者說默認的值
缺省輸入或者默認輸入叫做標準輸入,默認的或者缺省的輸入是鍵盤輸入
比如說cat命令,這裏可以說是cat程序,如果你不指定文件,也就是數據來源,那麽它默認從鍵盤獲取你的輸入。但是有些命令自身具有默認的數據輸入位置,比如ls命令,如果不給定ls命令輸入的數據,那麽默認以當前位置為輸入數據
缺省輸出或者默認輸出叫做標準輸出,默認的或者缺省的輸出是監視器(monitor)
默認的錯誤輸出或者缺省的錯誤輸出叫做標準錯誤輸出
不管是bash報錯還是某個命令自身報錯都屬於標準錯誤輸出,這個輸出是與標準輸出不相瓜葛的輸出,即是一個獨立的輸出數據流,但是他的輸出位置默認是監視器(monitor)
I/O重定向:改變標準輸入或者標準輸出的位置
輸出重定向( >、>> )
語法
COMMAND > new_pos
COMMAND >> new_pos
分類
>:表示覆蓋重定向,目標文件原有內容會被覆蓋
案例演示
[root@oldboy ~]# ls /var > /tmp/var.txt
>>:追加重定向,在目標文件原有內容下追加新內容
案例演示
[root@oldboy ~]# ls /etc/ >> /tmp/etc.txt
註意:輸出重定向是非常危險的操作,誤操作就可能把你的重要數據給覆蓋了。
問題:bash中有沒有可以設置關閉和打開這個輸出重定向功能呢?
解決方式
set -C 命令:禁止將內容覆蓋輸出到已有文件內容,但是不存在的文件是可以進行輸出重定向的,這個對標準錯誤輸出也起作用
另外一個現實:
輸出重定向新問題:bash支持強制輸出覆蓋:>|
案例演示
cat /etc/fstab >| /tmp/a.txt
set +C命令:關閉禁止將內容覆蓋輸出到已有文件內容,也就是可以覆蓋輸出到已有內容的文件
標準錯誤輸出
當我們執行一條有時命令會報錯,但是這個錯誤輸出默認是輸出到監視器,那麽我們怎麽重定向這個標準的錯誤輸出呢?
標準錯誤輸出重定向
語法
COMMAND 2> new_pos
COMMAND 2>> new_pos
分類
2>:表示覆蓋重定向錯誤輸出流,目標文件原有內容會被覆蓋
案例演示
[root@oldboy ~]# ls /varr 2> /tmp/var.txt
2>>:表示追加重定向錯誤輸出流,在目標文件原有內容下追加新內容
案例演示
[root@oldboy ~]# ls /etcc/ 2>> /tmp/etc.txt
我們想把錯誤的輸出或者正確的輸出到不同位置
語法
COMMAND >> new_pos 2>> err_new_pos
COMMAND > new_pos 2> err_new_pos
錯誤或者正確的輸出流合並至同一個數據流進行重定向
語法
COMMAND &> new_pos
COMMAND &>> new_pos
COMMAND > new_pos 2> &1
&>:覆蓋重定向
&>>:追加重定向
2> &1:表示將標準錯誤的輸出流導向與標準輸入出流同一個地方,而標準輸出流導向了一個文件,那麽標準錯誤輸出流也導向與標準輸出流同樣的地方
輸入重定向
輸入重定向使用的意義:有些命令在執行時不能夠帶文件作為參數的命令,默認只能從標準輸入中讀數據,那麽我們可以強行使用輸入重定向讓他從文件獲取數據
語法
COMMAND < old_pos
old_pos為一個文件或者其他數據來源
輸入重定向有沒有使用兩個小於號的必要?其實是有的,(<<)兩個小於號是用來創建文檔的
案例演示
[root@oldboy ~]# cat <<EOF > 123 > asd > qe > 123 > > EOF 123 asd qe 123
這個有什麽用呢?
默認從鍵盤鍵入的字符,輸出到的是監視器上,那麽我們可以將這些輸出的字符重定向到我們指定的文件
案例演示
[root@oldboy ~]# cat >> /tmp/b.txt <<EOF > hello world > are you ok? > thanks > byebye > EOF [root@oldboy ~]# cat /tmp/b.txt hello world are you ok? thanks byebye
管道
基本介紹
我們可以將一個命令的輸出當做另一個命令的輸入,並且這個樣無限下去
基本語法
COMMAND1 | COMMAND2 | COMMAND3....
使用案例
[root@oldboy ~]# echo $PATH | tr ‘a-z‘ ‘A-Z‘ /USR/LIB64/QT-3.3/BIN:/USR/LOCAL/SBIN:/USR/LOCAL/BIN:/SBIN:/BIN:/USR/SBIN:/USR/BIN:/ROOT/BIN
未完,待續......
linux基礎之bash特性