一、命令歷史
概念:shell進程能夠將之前執行過的命令保存記錄下來
存儲位置:
1、命令歷史的文件
使用以下環境變量查看相關參數:
HISTFILE:查看文件地址(一般為.bash_histroty)
HISTFILESIZE:命令歷史文件的大小
2、當前shell進程中,相當于內存緩存吧
使用以下環境變量查看相關參數:
HISTSIZE:可保留命令的歷史的條數
查看命令歷史:~] history
用法:
history [-c] [-d 偏移量] [n]
或 history -anrw [文件名]
或 history -ps 參數 [參數…]
-c:清空命令歷史
-d offset:刪除指定命令歷史
-r : 從文件讀取命令歷史追加至歷史文件中
-w:把歷史列表中的命令追加至歷史文件中
histroy #:顯示最近的#條命令
調用歷史列表中的命令:
!#:再一次執行歷史列表中的第#條命令;
!!:再一次執行上一條命令,也可以用向上箭頭;
!STRING:再一次執行命令歷史列表最近一個以STRING開頭的命令;
注意:命令的重復執行有時候需要依賴于冪等性(個人通俗理解,就是多次執行的結果都一樣)
有時候需要重復使用上一條命令的最后一個參數:
快捷鍵:ESC,.(先按以下ESC,松開后緊接著按下.)
或輸入字符串 !$ 即可代替上一條命令的最后一個參數
命令記錄的一個特性:
是否記錄重復,是否記錄空白字符開頭的
使用環境變量HISTCONTROL控制
1、ignoredups:忽略重復
2、ignorespace:忽略空白字符開頭的
3、ignoreboth:兩者都忽略
二、命令補全
為了提高用戶的體驗,能夠簡單準確地調用命令,當用戶輸入命令的部分字符時,可以敲tab建,shell會把已輸入的字符作為開頭去匹配命令,如果匹配到就補全這個命令。如果匹配到了多個或沒有匹配到則不顯示,這時候則可以再敲一次tab鍵,如果有匹配到多個,就會列出匹配到的命令以供選擇。如果沒有匹配到,則依然不顯示。
路徑補全,同命令補全。
三、命令行展開
命令行展開是針對于命令中需要輸入多個路徑時的一種合并簡單寫法
~:此符合作為路徑時會自動展開(替換)為用戶家目錄,或指定用戶家目錄
{}:大括號里以逗號分隔的多項字符,會分別與大括號左后的內容進行拼接成多個路徑;
例如:/tmp/{a,b}/d 會展開為兩個路徑:/tmp/a/d /tmp/b/d
四:命令執行狀態結果
每條命令的執行結果都有一個對應的狀態碼,也成為退出碼
0:成功
1-255:表示不同的失敗
深入說明參考:
http://teliute.org/linux/abs-3.9.1/exitcodes.html
有的命令正常執行,也會返回一些執行結果。
返回結果,跟返回碼的區別
返回碼只是命令的執行成功與否。
結果是狀態執行完畢產生的一些數據輸出。
用特殊變量 $? 可以查看上一條執行命令的返回碼。
執行結果的引用:
$(COMMAND)
`COMMAND`
五、快捷鍵
Ctrl+a:跳轉到命令行的行首
Ctrl+e:跳轉到命令行的行尾
Ctrl+u:刪除光標位置到行首之間的字符
Ctrl+k:刪除光標位置到行尾之間的字符
Ctrl+l:清屏
六、globbing(文件名通配,匹配的整體,也就是完全符合通配符)
匹配模式:元字符
*:匹配任意長度的任意字符
?:匹配任意單個字符
[]:匹配指定范圍內的任意單個字符
下面是幾種特殊格式,他們代表某類字符組:
1、[a-z],[A-Z],[0-9],[a-z0-9]
2、[[:upper:]]:所有大寫字母
3、[[:lower:]]:所有小寫字母
4、[[:alpha:]]:所有字母
5、[[:digit:]]:所有數字
6、[[:alnum:]]:所有數字和字母
7、[[:space:]]:所有空白字符
8、[[:punct:]]:所有標點字符
[^]:匹配制定范圍外的任意單個字符
如:[^[:upper:]]所有非大寫字母
七、IO重定向
每個程序的執行都有輸入數據和輸出數據,程序的數據流有三種:
(1)、輸入的數據流:<– 標準輸入(stdin), 數據來源:鍵盤;
(2)、輸出的數據流:–> 標準輸出(stdout),數據去向:顯示器;
(3)、錯誤的輸出流:–> 錯誤輸出(stderr),數據去向:顯示器;
(一)、IO
概念:輸入輸出
[一]、輸入 input
設備:文件、鍵盤、網卡等;
[二]、輸出 output
設備:文件、顯示器、網卡、打印機等;
(二)、重定向:也就是改變數據流的來源或去向。
[一]、多個命令時管道鏈接數據流入流出
概念:
鏈接命令,將前一個程序執行的結果直接定向到后一個程序當做輸入數據流
用法:
COMMAND1 | COMMAND2 | COMMAND3 | …
特殊用法:
tee命令:
經常用在兩個管道之間,將輸入的數據接收保存到文件中,并把輸入數據再次原樣接力輸出。
tee /PATH/TO/SOMEFILE
[二]、三種數據流分別對應的重定向方式:
█ 標準輸出:
> /PATH/TO/SOMEFILE
>> /PATH/TO/SOMEFILE
區別:是否覆蓋已存在的文件,> 覆蓋文件,>> 追加文件中
可以設置是否允許覆蓋
set -C: 不允許 > 覆蓋,但仍然可以用 :> 強行覆蓋
set +C: 關閉上述特性
█ 錯誤輸出:
2> /PATH/TO/SOMEFILE
2>> /PATH/TO/SOMEFILE
合并以上兩種輸出到一個目標文件:
(1)、&>, &>>
(2)、
COMMAND > /path/to/somefile 2>&1
COMMAND >> /path/to/somefile 2>&1
█ 輸入:
<
通常用在一些被動接收輸入數據的命令上。如tr、cut等。
Here Document:
<< 文檔輸入模式,定義一個起始和結束符。例如以下在定義的特殊字符EOF后可以隨意輸入,所以換行,直到出現最后一行EOF字符結束輸入
cat << EOF
cat /PATH/TO/SOMEFILE << EOF
八、命令hash
概念:
之前介紹過shell執行命令調用時,會在環境變量PATH所保存的目錄下依次查找對應二進制程序。找到并調用之,但是每次查找會耗時,為了減輕耗時,會把調用過的命令緩存起來,加速命令調用。
存儲格式:
鍵值對:比如你使用了次命令ls,那么會存一條: ls –> /usr/bin/ls
查看方法:
hash:默認列出存儲的hash值,
-l,列出詳細信息
-d COMMAND :刪除某條命令的緩存
-r:清空
九、bash的變量
概念:
個人有編程經驗,暫時不做解釋
變量類型:
bash按個人理解應該屬于弱類型變量,bash會把所有變量統統視為字符串;
既然是弱類型,無需聲明,直接賦值使用即可。
變量名規則與規范:
只能包含數字、字母、下劃線
不能以數字開頭
不能使用編程語言的自身保留字
最好見名知義,明確表明變量所代表的意義
變量替換:
把命令中引用的變量,替換為對應內存空間上的數據。
作用范圍:
本地變量:作用域為當前shell進程
環境變量:作用于為當前shell及其子進程
局部變量:作用于為代碼片段(比如函數內的變量)
特殊變量:shell內置具有特殊功能的變量
$?:前面說過,表示命令執行返回狀態碼。
注意:bash內嵌了許多環境變量(通常為全大寫字符),用于定義bash的工作環境
PATH, HISTFILE, HISTSIZE, HISTFILESIZE, HISTCONTROL, SHELL, HOME, UID, PWD, OLDPWD
變量聲明:
name=value
默認為本地變量,在函數體內聲明就是局部變量(純屬個人猜測),如需設為環境變量,需要導出為全局變量。
聲明為環境變量:
(1)、export name=value
(2)、name=value
export name
(3)、declare -x name=value
(4)、name=value
declare -x name
變量引用:
${var_name} 當引用有歧義時,可用大括號表明
$var_name
查看變量:(列出當前shell可用變量,并非引用)
查看所有變量
set
查看環境變量
export, declare -x, printenv, env
撤銷變量:
unset name
只讀變量:
(1) declare -r name=value
(2) readonly name=value
只讀變量無法重新賦值,并且不能撤銷,聲明周期為當前shell的生命周期,隨shell的終止而終止。
十、多命令執行
(一)、按順序執行
COMMAND1; COMMAND2; COMMAND3; …
(二)、邏輯控制執行
COMMAND1 && COMMAND2
COMMAND1 || COMMAND2
十一、bash的配置文件
配置文件的意義:
命令行中定義的特性,例如變量和別名作用域為當前shell生命期;那么配置文件定義的特性只對以后新啟動的shell都有效。
修改配置文件,立即對當前shell生效
1、通過命令行重新定義一次
2、讓shell重新讀取配置文件
~] source /PATH/FROM/CONF_FILE
~] . /PATH/FROM/CONF_FILE
按登錄類型分:
■ profile類:為交互式登錄的shell提供配置
交互式登錄:
1、直接通過某終端輸入賬號密碼登錄后打開的shell進程
2、使用su命令:su – USERNAME或 su -l USERNAME 執行的登陸切換。
功用:
1、用于定義環境變量
2、運行命令或腳本
作用范圍:
1、全局:對所有用戶都生效;
/etc/profile
/etc/profile.d/*.sh
2、用戶個人:對當前用戶有效
~/.bash_profile
■ bashrc類:為非交互式登錄的shell進程提供配置
非交互式登錄:
1、su USERNAME執行的命令切換
2、圖形界面下打開的終端
3、運行腳本
功用:
1、定義本地變量
2、定義命令別名
作用范圍:
1、全局
/etc/bashrc
用戶個人:
~/.bashrc
注意:只有管理員可以修改全局配置
交互式登錄shell進程加載配置文件的過程:
/etc/profile –> /etc/profile.d/* –> ~/.bash_profile –> ~/.bashrc –> /etc/bashrc
非交互式登錄shell進程加載配置文件的過程:
~/.bashrc –> /etc/bashrc –> /etc/profile.d/*
原創文章,作者:小江,如若轉載,請注明出處:http://www.www58058.com/38876