記錄指令曆史
我們敲過的指令,linux是會有記錄的,預設可以記錄1000條曆史指令。這些指令儲存在使用者的家目錄中的.bash_history檔案中。有一點需要你知道的是,隻有當使用者正常退出目前shell時,在目前shell中運作的指令才會儲存至.bash_history檔案中。
與指令曆史有關的有一個有意思的字元那就是 ‘!’ 了。常用的有這麼幾個應用:
1) 連續兩個 ‘!’, 表示執行上一條指令;
[root@localhost ~]# pwd
/root
[root@localhost ~]# !!
pwd
2) !n 這裡的n是數字,表示執行指令曆史中第n條指令,例如 !1002 表示執行指令曆史中第1002個指令;
[root@localhost ~]# history |grep 1002
1002 pwd
1015 history |grep 1002
[root@localhost ~]# !1002
history 指令如果未改動過環境變量,預設可以把最近1000條指令曆史列印出來。
3) !字元串 (字元串大于等于1),例如 !pw 表示執行指令曆史中最近一次以 ‘pw’ 為開頭的指令。
[root@localhost ~]# !pw
- 指令和檔案名補全
最開始阿銘就介紹過這個功能了,記得嗎?它就是按tab鍵,它可以幫你補全一個指令,也可以幫你補全一個路徑或者一個檔案名。
連續按兩次tab鍵,系統則會把所有的指令或者檔案名都列出來。
- 别名
前面也出現過alias的介紹,這個就是bash所特有的功能之一了。我們可以通過alias把一個常用的并且很長的指令别名一個簡潔易記的指令。
如果不想用了,還可以用unalias解除别名功能。直接敲alias會看到目前系統預設的alias.
系統預設的alias指令也就這幾個而已,你也可以自定義你想要的指令别名。alias文法很簡單,
文法: alias [指令别名]=['具體的指令']
[root@localhost ~]# alias qiangzi='pwd'
[root@localhost ~]# qiangzi
[root@localhost ~]# unalias qiangzi
bash: qiangzi: command not found
使用 unalias 指令别名 就可以把設定的别名給解除了。
- 通配符
在bash下,可以使用 * 來比對零個或多個字元,而用 ? 比對一個字元。
[root@localhost ~]# ls -d test*
test1.txt test2 test3 test.pl test.txt
[root@localhost ~]# ls -d test?
test2 test3
- 輸入輸出重定向
輸入重定向用于改變指令的輸入,輸出重定向用于改變指令的輸出。
輸出重定向更為常用,它經常用于将指令的結果輸入到檔案中,而不是螢幕上。輸入重定向的指令是<,輸出重定向的指令是>,另外還有錯誤重定向2>,以及追加重定向>>
[root@localhost ~]# echo "123" >1.txt
[root@localhost ~]# echo "123" >>1.txt
[root@localhost ~]# cat 1.txt
123
- 管道符
前面已經提過過管道符 “|”, 就是把前面的指令運作的結果丢給後面的指令。
[root@localhost ~]# cat /etc/passwd|wc -l
24
wc -l 指令是列出檔案行數
- 作業控制
當運作一個程序時,你可以使它暫停(按Ctrl+z),然後使用fg指令恢複它,利用bg指令使他到背景運作,你也可以使它終止(按Ctrl+c)。
[root@localhost ~]# vi test1.txt
testtestsstststst
使用 “vi” 編輯test1.txt, 随便輸入一些内容,按 “ESC" 後,使用 "Ctrl + z” 使任務暫停:
[1]+ Stopped vi test1.txt
可以看到提示 “vi test1.txt” 已經停止了,然後使用fg指令恢複它,此時又進入剛才的 “vi” 視窗了。再次使其暫停,然後輸入 jobs, 可以看到在被暫停或者在背景運作的任務:
[root@localhost ~]# jobs
如果想把暫停的任務丢在背景跑起來,就使用bg指令:
[root@localhost ~]# bg
[1]+ vi test1.txt &
但是 vi 似乎并不支援在背景運作,那換一個其他的指令:
[root@localhost ~]# vmstat 1 > /tmp/1.log
^Z
[2]+ Stopped vmstat 1 > /tmp/1.log
[1]- Stopped vi test1.txt
[root@localhost ~]# bg 2
[2]+ vmstat 1 > /tmp/1.log &
在上面的例子中,又有一個新的知識點需要知道.
那就是多個被暫停的任務會有編号,使用 jobs 指令可以看到兩個任務,那麼使用bg或者fg的時候,就需要在後面加一個編号了,使用 bg 2 把第二個被暫停的任務丢到背景跑起來了,丢入背景需要使用在指令後邊加一個 & 符号,中間有個空格。本例中的 vmstat 1 這個是用來觀察系統狀态的一個指令
丢到背景的任務如何關掉呢?如果你沒有退出剛才的shell, 那麼先使用 fg 編号 把任務調到前台,然後使用 “Ctrl + c” 結束任務:
[root@localhost ~]# fg 2
vmstat 1 > /tmp/1.log
^C
另一種情況則是,關閉到目前的shell, 再次打開另一個shell時,使用jobs指令并不會顯示在背景運作或者被暫停的任務,要想停掉它的話,則需要先知道其pid, 然後使用kill指令殺死那個程序。
[root@localhost ~]# vmstat 1 > /tmp/1.log &
[1] 9433
[root@localhost ~]# ps aux |grep vmstat
root 9433 0.0 0.0 6180 516 pts/2 S 09:57 0:00 vmstat 1
root 9435 0.0 0.0 103308 848 pts/2 S+ 09:58 0:00 grep vmstat
使用 & 把任務丢入背景運作,它會顯示pid資訊,如果忘記這個pid,我們還可以使用 ps aux 指令找到那個程序,想結束掉該程序,需要使用 kill 指令: