天天看點

shell特性

記錄指令曆史

我們敲過的指令,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

  1. 指令和檔案名補全

最開始阿銘就介紹過這個功能了,記得嗎?它就是按tab鍵,它可以幫你補全一個指令,也可以幫你補全一個路徑或者一個檔案名。

連續按兩次tab鍵,系統則會把所有的指令或者檔案名都列出來。

  1. 别名

前面也出現過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 指令别名 就可以把設定的别名給解除了。

  1. 通配符

在bash下,可以使用 * 來比對零個或多個字元,而用 ? 比對一個字元。

[root@localhost ~]# ls -d test*

test1.txt  test2  test3  test.pl  test.txt

[root@localhost ~]# ls -d test?

test2  test3

  1. 輸入輸出重定向

輸入重定向用于改變指令的輸入,輸出重定向用于改變指令的輸出。

輸出重定向更為常用,它經常用于将指令的結果輸入到檔案中,而不是螢幕上。輸入重定向的指令是<,輸出重定向的指令是>,另外還有錯誤重定向2>,以及追加重定向>>

[root@localhost ~]# echo "123" >1.txt

[root@localhost ~]# echo "123" >>1.txt

[root@localhost ~]# cat 1.txt

123

  1. 管道符

前面已經提過過管道符 “|”, 就是把前面的指令運作的結果丢給後面的指令。

[root@localhost ~]# cat /etc/passwd|wc -l

24

wc -l 指令是列出檔案行數

  1. 作業控制

當運作一個程序時,你可以使它暫停(按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 指令: