摘要:首先學(xué)習(xí)歷史命令記錄的查看搜索增加和刪除等基本操作。刪除命令刪除指定歷史命令位置的命令,可以通過(guò)如的命令實(shí)現(xiàn),如下示例如果歷史記錄如下所示,執(zhí)行會(huì)將這條記錄刪除。清空歷史命令會(huì)清空當(dāng)前會(huì)話終端中的所有歷史命令,重新記錄。
今天將聊的是每個(gè)用過(guò)Linux控制臺(tái)的朋友都知道的一個(gè)存在:terminal的歷史記錄。關(guān)于它最常見(jiàn)的操作就是使用上下方向鍵進(jìn)行歷史命令的切換。剛接觸命令行的同學(xué)會(huì)覺(jué)得這樣就找到歷史的操作真的非常棒。但是用的久了,會(huì)覺(jué)得每次上下鍵查看太煩人,甚至?xí)泻芏嘁蓡?wèn)和其他的一些需求。比如:
怎么快速找到之前執(zhí)行過(guò)的命令;
是否可以利用歷史記錄提高控制臺(tái)操作效率;
為什么有些命令明明執(zhí)行過(guò)但卻找不到;
還有很多其他要求。這篇文章會(huì)告訴你,哪些都可以做到,以及如何更好的利用。
先說(shuō)明一下,我的實(shí)驗(yàn)環(huán)境是centos7。首先按如下順序輸入一些命令:
$ cd /home/poloxue/Public/
$ mkdir Work
$ cd Work
$ mkdir web
$ mkdir app
$ mkdir logs
$ cd logs
$ cp /var/log/openvpnas.log .
執(zhí)行結(jié)束之后。首先學(xué)習(xí)歷史命令記錄的查看、搜索、增加和刪除等基本操作。
如何查看歷史命令 簡(jiǎn)單查閱首先明確一點(diǎn),歷史命令是按照?qǐng)?zhí)行時(shí)間先后順序進(jìn)行排序的。簡(jiǎn)單查看可使用上下鍵查閱歷史命令;
除了上下鍵操作查看歷史命令之外,可以通過(guò)兩個(gè)快捷鍵(我常使用的方式):
ctrl+p 上查歷史命令,同向上鍵,prev;
ctrl+n 下查歷史命令,同向下鍵,next;
這是最常用的操作方式,這種方式查閱最近幾條執(zhí)行命令效率較高,同時(shí)我們的使用頻率也最高。但是對(duì)于較早時(shí)間執(zhí)行的命令查閱卻很是不便;
使用history命令history命令是和歷史命令息息相關(guān)的一個(gè)命令,作用對(duì)象就是歷史命令。看一下history命令怎么查詢最近使用的命令記錄?
history [n] 展示最近執(zhí)行的n條記錄,例如:
$ history 3
按時(shí)間倒序展示最近歷史命令,結(jié)果如下:
$ mkdir logs
$ cd logs
$ cp /var/log/openvpnas.log .
說(shuō)明一下,如果沒(méi)有追加任何的參數(shù),則展示全部歷史記錄;
歷史命令搜索據(jù)我所知,history命令本身不支持搜索,兩種方式可以實(shí)現(xiàn)這個(gè)功能:ctrl+r快捷鍵和history+grep組合命令。
ctrl+r搜索查看功能假設(shè)你搜索最近關(guān)于cp的操作,按下ctrl+r快捷鍵之后輸入cp,效果如下:
$
(reverse-i-search)`cp": cp /var/log/openvpnas.log .
此時(shí)按下enter鍵選中便可選中命令并執(zhí)行。需要注意,ctrl+r搜索結(jié)果為最近執(zhí)行符合搜索要求的一條命令。
history+grep搜索查看功能:為什么需要?ctrl+r只能搜索最近執(zhí)行的命令,如果需要所有滿足匹配的歷史記錄,或者不能完整記住有關(guān)單詞的情況下,history+grep組合可以滿足我們的要求。
例如,搜索所有關(guān)于openvpn的操作。
$ history | grep openvpn
history列出所有歷史記錄,然后利用grep的強(qiáng)大搜索功能,如支持通配符,正則等高級(jí)特性,基本可以滿足你的任何需求;
記錄歷史命令(寫(xiě)入與刪除)個(gè)人認(rèn)為,歷史命令存在于兩個(gè)區(qū)域,一是每開(kāi)啟一個(gè)新終端都會(huì)加載的HISTFILE文件,二是當(dāng)前會(huì)話終端開(kāi)啟后執(zhí)行的命令,這些命令可以理解為存儲(chǔ)在內(nèi)存中,但尚未寫(xiě)入HOSTFILE文件中的部分。
默認(rèn)寫(xiě)入當(dāng)前會(huì)話終端關(guān)閉后,會(huì)自動(dòng)將此會(huì)話終端執(zhí)行的歷史命令追加到$HISTFILE文件中。
手動(dòng)寫(xiě)入默認(rèn)需要關(guān)閉終端才能將當(dāng)前終端的歷史命令寫(xiě)入到$HISTFILE中,如需手動(dòng)寫(xiě)入可執(zhí)行如下命令:
$ history -w
效果與關(guān)閉終端效果一樣,會(huì)將當(dāng)前終端執(zhí)行的沒(méi)有寫(xiě)入到HISTFILE中。
刪除命令刪除指定歷史命令位置的命令,可以通過(guò)如history -d n的命令實(shí)現(xiàn),如下示例:
$ history -d 1
如果歷史記錄如下所示,執(zhí)行history -d 1會(huì)將mkdir public這條記錄刪除。
1 mkdir Public
2 cd Public/
3 mkdir work
4 cd work
5 mkdir web
6 mkdir app
7 mkdir logs
8 cd logs
7 cp /var/log/openvpnas.log
清空歷史命令
history -c 會(huì)清空當(dāng)前會(huì)話終端中的所有歷史命令,重新記錄。但此時(shí)只是改變了當(dāng)前會(huì)話終端中的記錄,并沒(méi)有記錄到$HISTFILE文件中。
哪些配置項(xiàng)歷史記錄的控制方式我們也可以通過(guò)配置項(xiàng)來(lái)改變。
HISTSIZE與HISTFILESIZEHISTSIZE 定義了控制臺(tái)輸出命令記錄數(shù)量;
HISTFILESIZE 定義了HISTFILE文件中存放命令記錄的數(shù)量;
$ echo $HISTSIZE
2000
$ echo $HISTFILESIZE
2000
我們可以看到打印的默認(rèn)配置HISTSIZE與HISTFILESIZE大小一樣。當(dāng)歷史命令超過(guò)規(guī)定數(shù)量會(huì)自動(dòng)覆蓋,為了更好的利用和防止歷史命令,可以將HISTFILESIZE與HISTSIZE調(diào)整的大一些;
$ vim .bashrc
在/$HOME/.bashrc添加如下內(nèi)容:
export HISTFILESIZE=3000
export HISTSIZE=3000
關(guān)于HISTTIMEFORMAT顯示命令執(zhí)行時(shí)間戳
默認(rèn)情況下,執(zhí)行history會(huì)輸出記錄編號(hào)和歷史命令。如果為了審查目的,想知道某條命令具體的執(zhí)行時(shí)間,配置HISTTIMEFORMAT??梢耘渲肏ISTTIMEFORMAT為"%F %T "
$ export HISTTIMEFORMAT="%F %T "
此時(shí)執(zhí)行history命令,如下效果:
1 2019-03-15 18:50:12 mkdir Public
2 2019-03-15 18:50:15 cd Public/
3 2019-03-15 18:50:17 mkdir work
4 2019-03-15 18:50:19 cd work
5 2019-03-15 18:50:22 mkdir web
6 2019-03-15 18:50:23 mkdir app
7 2019-03-15 18:50:25 mkdir logs
8 2019-03-15 18:50:29 cd logs
7 2019-03-15 18:50:39 cp /var/log/openvpnas.log
從上圖可以看出,除了顯示記錄編號(hào)與歷史命令之外,還多了執(zhí)行時(shí)間一列。如果此功能經(jīng)常用到,可以將export HISTTIMEFORMAT="%F %T " 添加到/$HOME/.bashrc文件中。
HISTCONTROL與HISTIGNOREHISTCONTROL與HISTIGNORE可提高文件有限的利用率。通過(guò)上面的了解,我們知道歷史命令的記錄數(shù)量是有上限的。為了提高歷史命令的利用,可以使用兩種方式:一是增加歷史命令的HISTFILESIZE和HISTSIZE,二是減少無(wú)用歷史命令記錄,增加固定大小HISTFILESIZE的空間利用率;
第一種方式就不做介紹,第二種方式就使用兩個(gè)配置項(xiàng):HISTCONTROL與 HISTIGNORE。
去除連續(xù)重復(fù)命令
設(shè)置HISTCONTROL為ignoredups,如下:
$ export HISTCONTROL=ignoredups
如我們執(zhí)行已經(jīng)執(zhí)行了如下的命令列表:
$ ls
$ export HISTCONTROL=ignoredups
$ ls
$ history
$ pwd
$ pwd
執(zhí)行history查看歷史,輸出效果如下:
1 ls
2 export HISTCONTROL=ignoredups
3 ls
4 history
5 pwd
6 history
從上圖可以看出,當(dāng)HISTCONTROL為ignoredups,重復(fù)兩次的pwd會(huì)合并為一條。但是從上圖中可以看出,對(duì)于不連續(xù)的history仍然保留了兩條,下面解決一下這個(gè)問(wèn)題。
去除全局重復(fù)歷史命令
上面的示例提出了一個(gè)問(wèn)題,HISTCONTROL為ignoredups并沒(méi)有去除非連續(xù)的重復(fù)命令。下面將HISCONTROL設(shè)置為erasedups,如下:
$ export HISTCONTROL=erasedups
效果如下:
$ ls
$ pwd
$ cd .
$ pwd
$ ls openvpn-as-2.0.10-CentOS7.x86_64.rpm
執(zhí)行history,輸出j結(jié)果如下:
1 ls
2 cd
3 pwd
4 ls openvpn-as-2.0.10-CentOS7.x86_64.rpm
5 history
由此可知,雖然執(zhí)行兩次pwd,而且是非連續(xù)的,但是只保存了一條記錄。這樣就可以高效的使用歷史命令有限的存儲(chǔ)空間,但是如果你有需求要保留每次命令執(zhí)行情況,以便日后審查,那就不能干了。
空格隱去無(wú)用歷史命令
有沒(méi)有這樣一種需求?有些命令我執(zhí)行了,但是我不想讓別人知道。實(shí)現(xiàn)這種需求有兩種方式:
一種是通過(guò)配置空格隱去無(wú)用歷史命令
二是通過(guò)配置指定某些命令需要隱去。
我們來(lái)先說(shuō)第一種。首先,進(jìn)行設(shè)置HISTCONTROL為ignorespace,如下所示:
$ export HISTCONTROL=ignorespace
作用是所執(zhí)行命令以空格開(kāi)頭,不做歷史記錄。執(zhí)行命令如下:
$ history
$ pwd
$ cd
$ ls
pwd和cd前面都增加了空格,history此時(shí)輸出:
1 history
2 ls
3 history
pwd和cd以空格開(kāi)頭,而history和ls為正常輸入。此時(shí)記錄中只有history與ls。不過(guò),個(gè)人感覺(jué)這種方式不是很好且具有不可控性,有可能產(chǎn)生誤操作導(dǎo)致想要的歷史命令丟失歷史等情況。那有沒(méi)有辦法指定某些命令被忽略,比如ls, history這些不想保留在歷史中。繼續(xù)往下看...
指定忽略的命令
為了實(shí)現(xiàn)指定命令忽略,需要另外一個(gè)配置項(xiàng):HISTIGNORE。如需要隱去ls, ls -l,pwd, history的執(zhí)行記錄,可以通過(guò)如下設(shè)置:
$ export HISTIGNORE="pwd:ls:ls -l:history"
測(cè)試一下,先來(lái)按順序執(zhí)行如下命令:
$ history
$ pwd
$ ls -l
$ ls Public/
然后看一下history的輸出結(jié)果:
1 ls Public/
我們執(zhí)行了history, pwd, ls -l, ls Public/,但是記錄中我們只發(fā)現(xiàn)只有 ls Public/ 被記錄了下來(lái)。
突然覺(jué)得這個(gè)功能真的好強(qiáng)大,有效利用可以減少無(wú)用歷史命令的存儲(chǔ),還可以啟到安全作用。當(dāng)然,具體省略哪些命令要因人具體情況而定,也不能省略太多。
配置HISTFILE通過(guò)配置HISTFILE可以改變記錄歷史命令的文件文件,默認(rèn)/$HOME/.bashrc。這就不多說(shuō)了。一般情況不會(huì)改變?cè)撐募奈恢谩?/p> 利用歷史命令快速編輯
上面說(shuō)了那么多,主要是為了更高效的使用。接下來(lái)介紹些更牛的用法:
快速指定歷史命令快速選中指定命令,一種是使用 ! ,通過(guò)命令執(zhí)行順序編號(hào)或者通過(guò)命令開(kāi)頭選中,二可以通過(guò)ctrl+r搜索快速選中,前面已作過(guò)介紹,不多說(shuō)。下面看看第一種情況,假設(shè)此刻歷史命令如下:
1 ls Public/
2 export HISTCONTROL=erasedups
3 ls HISTCONTROL=erasedups
4 ls
5 history
我們直接通過(guò)示例來(lái)說(shuō)明:
$ !1 // 執(zhí)行命令為ls public
$ !-1 // 執(zhí)行命令為history
$ !! // 等同于!-1
$ !export // 執(zhí)行命令為export HISTCONTROL=erasedups
從上面可以看出,!的幾種常見(jiàn)用法:
!n 指定編號(hào)命令
!-n 倒序n處命令
!! !-1的簡(jiǎn)寫(xiě),也就是最近的一條命令
!str 以str開(kāi)頭的最近一條命令,這種方式str中不能存在空格,可使用ctrl+r快捷鍵代替。
快速選中指定參數(shù)通常在執(zhí)行命令時(shí),參數(shù)的復(fù)雜度都大于命令自身。如果能夠?qū)崿F(xiàn)快速選中命令的某個(gè)參數(shù)那就非常cool了。非常幸運(yùn),這也可以做到。假設(shè)歷史命令如下:
$ history
history
ls public/
ls example01 example02 public/
export HITCONTROL=erasedups
ls ~
示例說(shuō)明:
引用某命令的第一個(gè)參數(shù) 例如,引用第三條命令的第一個(gè)參數(shù)
$ ls -l !3:^
上述命令的效果相當(dāng)于ls -l example01
例如,引用最新一條以export開(kāi)頭的命令的第一個(gè)參數(shù)
$ ls -l !export:^
效果相當(dāng)于ls -l HISTCONTROL=erasedups。我們可以記住一個(gè)簡(jiǎn)寫(xiě),最近命令的第一個(gè)參數(shù) !!:^ ,簡(jiǎn)寫(xiě) !^。
引用某條命令的最后一個(gè)參數(shù)
例如,引用第三條命令的最后一個(gè)參數(shù)
$ ls -l !3:$
效果相等于ls -l Public/。對(duì)于引用最新命令的最后一個(gè)參數(shù)同樣有 !!: 兩種簡(jiǎn)寫(xiě)。
引用命令任意位置的參數(shù)
除了像開(kāi)頭結(jié)尾這種特殊位置參數(shù)外,我們也可以引用任意位置參數(shù)。還是以上圖中的第三條命令為例,現(xiàn)在我希望引用此命令的第二個(gè)參數(shù):
$ ls -l !3:2
如上面所示命令,此時(shí)的!3:2為example02。以此類推,簡(jiǎn)單測(cè)試一下我們可以知道,!3:0為ls, !3:1為example01, !3:3為Public/。由此可以得出,分號(hào)之后的數(shù)字指定的就是命令參數(shù)的位置,從0計(jì)數(shù)。
關(guān)于引用命令參數(shù)任意區(qū)間列表
除了指定某一個(gè)參數(shù)之外,選擇參數(shù)時(shí),我們還可以指定參數(shù)區(qū)間,如選擇1-2位置的參數(shù),開(kāi)頭至結(jié)尾處的參數(shù)等。格式:cmd:offset1-offset2。 以第三條歷史命令為例,如下:
$ echo !3:^-$ // 打印全部參數(shù)列表,即example01 example02 Public/
$ echo !3:1-2 // 打印1至2位置參數(shù),即example01 exmple02
從上面的示例,可以看出引用命令參數(shù)的格式通過(guò)分號(hào)分為兩部分,一是從哪條命令,二是哪個(gè)位置的參數(shù)。
歷史命令替換歷史命令替換用處不多,也只在有比較長(zhǎng)的命令比較高效,格式如下:
cmd:offset1-offset2:s/old/new/:s/old/new/
例如,替換歷史命令第3條命令參數(shù)example01位example1,example02為example2,Public為Work,如下:
$ echo !3:1-3:s/01/1/:s/02/2/:s/Public/Work/
如果比較熟悉vim的話,我們會(huì)發(fā)現(xiàn)某些操作和vim非常類似,比如這里的命令替換。
總結(jié)這些技巧理解起來(lái)比較簡(jiǎn)單,但是真正用好且確實(shí)提高效率是還需我們不斷實(shí)踐。介紹的部分功能是我們經(jīng)常使用的,但也有些功能在平時(shí)工作中很少用到。但合理用好它們,在我們遇到一些特殊場(chǎng)景時(shí),將會(huì)幫助我們更好解決問(wèn)題。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/7223.html
摘要:歡迎來(lái)我的博客閱讀打造高效個(gè)性一之打造高效個(gè)性二之前言作為一個(gè)集效率控顏值控強(qiáng)迫癥患者標(biāo)簽于一身的患者,對(duì)待自己工作用到的,自然是諸多要求。簡(jiǎn)介是一款免費(fèi)的,專為用戶打造的命令行應(yīng)用。新建窗口新建垂直新建水平新建打造高效個(gè)性二之 歡迎來(lái)我的博客閱讀:「打造高效個(gè)性Terminal(一)之 iTerm」「打造高效個(gè)性Terminal(二)之 zsh」 前言 作為一個(gè)集效率控、顏值控、強(qiáng)迫...
摘要:實(shí)際上,中使用庫(kù)的軟件非常多,這使得同時(shí)也成為了一個(gè)事實(shí)上的命令行交互標(biāo)準(zhǔn)。對(duì)語(yǔ)言來(lái)說(shuō),就是這樣一個(gè)幫助你搭建一個(gè)命令行交互界面的庫(kù)。命令行會(huì)將用戶輸入的一行原樣打印出來(lái)。 我們都知道,軟件的用戶界面無(wú)非分為 GUI (圖形用戶界面)和 CLI (命令行用戶界面)。對(duì)于我們經(jīng)常使用 Linux 的人來(lái)說(shuō),命令行界面一定非常熟悉。無(wú)論是 Shell 里輸入命令的界面,還是如 GDB 等軟...
閱讀 3306·2021-11-24 09:39
閱讀 2823·2021-10-12 10:20
閱讀 1922·2019-08-30 15:53
閱讀 3086·2019-08-30 14:14
閱讀 2615·2019-08-29 15:36
閱讀 1131·2019-08-29 14:11
閱讀 1963·2019-08-26 13:51
閱讀 3420·2019-08-26 13:23