国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

以Terminal歷史記錄來提高Linux操作效率

entner / 2275人閱讀

摘要:首先學習歷史命令記錄的查看搜索增加和刪除等基本操作。刪除命令刪除指定歷史命令位置的命令,可以通過如的命令實現,如下示例如果歷史記錄如下所示,執行會將這條記錄刪除。清空歷史命令會清空當前會話終端中的所有歷史命令,重新記錄。

今天將聊的是每個用過Linux控制臺的朋友都知道的一個存在:terminal的歷史記錄。關于它最常見的操作就是使用上下方向鍵進行歷史命令的切換。剛接觸命令行的同學會覺得這樣就找到歷史的操作真的非常棒。但是用的久了,會覺得每次上下鍵查看太煩人,甚至會有很多疑問和其他的一些需求。比如:

怎么快速找到之前執行過的命令;

是否可以利用歷史記錄提高控制臺操作效率;

為什么有些命令明明執行過但卻找不到;

還有很多其他要求。這篇文章會告訴你,哪些都可以做到,以及如何更好的利用。

先說明一下,我的實驗環境是centos7。首先按如下順序輸入一些命令:

$ cd /home/poloxue/Public/
$ mkdir Work
$ cd Work
$ mkdir web
$ mkdir app
$ mkdir logs
$ cd logs
$ cp /var/log/openvpnas.log .

執行結束之后。首先學習歷史命令記錄的查看、搜索、增加和刪除等基本操作。

如何查看歷史命令 簡單查閱

首先明確一點,歷史命令是按照執行時間先后順序進行排序的。簡單查看可使用上下鍵查閱歷史命令;

除了上下鍵操作查看歷史命令之外,可以通過兩個快捷鍵(我常使用的方式):

ctrl+p 上查歷史命令,同向上鍵,prev;

ctrl+n 下查歷史命令,同向下鍵,next;

這是最常用的操作方式,這種方式查閱最近幾條執行命令效率較高,同時我們的使用頻率也最高。但是對于較早時間執行的命令查閱卻很是不便;

使用history命令

history命令是和歷史命令息息相關的一個命令,作用對象就是歷史命令。看一下history命令怎么查詢最近使用的命令記錄?

history [n] 展示最近執行的n條記錄,例如:

$ history 3

按時間倒序展示最近歷史命令,結果如下:

$ mkdir logs
$ cd logs 
$ cp /var/log/openvpnas.log .

說明一下,如果沒有追加任何的參數,則展示全部歷史記錄;

歷史命令搜索

據我所知,history命令本身不支持搜索,兩種方式可以實現這個功能:ctrl+r快捷鍵和history+grep組合命令。

ctrl+r搜索查看功能

假設你搜索最近關于cp的操作,按下ctrl+r快捷鍵之后輸入cp,效果如下:

$
(reverse-i-search)`cp": cp /var/log/openvpnas.log .

此時按下enter鍵選中便可選中命令并執行。需要注意,ctrl+r搜索結果為最近執行符合搜索要求的一條命令。

history+grep搜索查看功能:

為什么需要?ctrl+r只能搜索最近執行的命令,如果需要所有滿足匹配的歷史記錄,或者不能完整記住有關單詞的情況下,history+grep組合可以滿足我們的要求。

例如,搜索所有關于openvpn的操作。

$ history | grep openvpn

history列出所有歷史記錄,然后利用grep的強大搜索功能,如支持通配符,正則等高級特性,基本可以滿足你的任何需求;

記錄歷史命令(寫入與刪除)

個人認為,歷史命令存在于兩個區域,一是每開啟一個新終端都會加載的HISTFILE文件,二是當前會話終端開啟后執行的命令,這些命令可以理解為存儲在內存中,但尚未寫入HOSTFILE文件中的部分。

默認寫入

當前會話終端關閉后,會自動將此會話終端執行的歷史命令追加到$HISTFILE文件中。

手動寫入

默認需要關閉終端才能將當前終端的歷史命令寫入到$HISTFILE中,如需手動寫入可執行如下命令:

$ history -w

效果與關閉終端效果一樣,會將當前終端執行的沒有寫入到HISTFILE中。

刪除命令

刪除指定歷史命令位置的命令,可以通過如history -d n的命令實現,如下示例:

$ history -d 1

如果歷史記錄如下所示,執行history -d 1會將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 會清空當前會話終端中的所有歷史命令,重新記錄。但此時只是改變了當前會話終端中的記錄,并沒有記錄到$HISTFILE文件中。

哪些配置項

歷史記錄的控制方式我們也可以通過配置項來改變。

HISTSIZE與HISTFILESIZE

HISTSIZE 定義了控制臺輸出命令記錄數量;

HISTFILESIZE 定義了HISTFILE文件中存放命令記錄的數量;

$ echo $HISTSIZE
 2000
$ echo $HISTFILESIZE
 2000

我們可以看到打印的默認配置HISTSIZE與HISTFILESIZE大小一樣。當歷史命令超過規定數量會自動覆蓋,為了更好的利用和防止歷史命令,可以將HISTFILESIZE與HISTSIZE調整的大一些;

$ vim .bashrc

在/$HOME/.bashrc添加如下內容:

export HISTFILESIZE=3000
export HISTSIZE=3000

關于HISTTIMEFORMAT顯示命令執行時間戳

默認情況下,執行history會輸出記錄編號和歷史命令。如果為了審查目的,想知道某條命令具體的執行時間,配置HISTTIMEFORMAT。可以配置HISTTIMEFORMAT為"%F %T "

$ export HISTTIMEFORMAT="%F %T "

此時執行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

從上圖可以看出,除了顯示記錄編號與歷史命令之外,還多了執行時間一列。如果此功能經常用到,可以將export HISTTIMEFORMAT="%F %T " 添加到/$HOME/.bashrc文件中。

HISTCONTROL與HISTIGNORE

HISTCONTROL與HISTIGNORE可提高文件有限的利用率。通過上面的了解,我們知道歷史命令的記錄數量是有上限的。為了提高歷史命令的利用,可以使用兩種方式:一是增加歷史命令的HISTFILESIZE和HISTSIZE,二是減少無用歷史命令記錄,增加固定大小HISTFILESIZE的空間利用率;

第一種方式就不做介紹,第二種方式就使用兩個配置項:HISTCONTROL與 HISTIGNORE。

    去除連續重復命令

設置HISTCONTROL為ignoredups,如下:

$ export HISTCONTROL=ignoredups

如我們執行已經執行了如下的命令列表:

$ ls
$ export HISTCONTROL=ignoredups
$ ls
$ history
$ pwd
$ pwd

執行history查看歷史,輸出效果如下:

1 ls
2 export HISTCONTROL=ignoredups
3 ls
4 history
5 pwd
6 history

從上圖可以看出,當HISTCONTROL為ignoredups,重復兩次的pwd會合并為一條。但是從上圖中可以看出,對于不連續的history仍然保留了兩條,下面解決一下這個問題。

    去除全局重復歷史命令

上面的示例提出了一個問題,HISTCONTROL為ignoredups并沒有去除非連續的重復命令。下面將HISCONTROL設置為erasedups,如下:

$ export HISTCONTROL=erasedups

效果如下:

$ ls 
$ pwd
$ cd .
$ pwd
$ ls openvpn-as-2.0.10-CentOS7.x86_64.rpm

執行history,輸出j結果如下:

1 ls
2 cd
3 pwd
4 ls openvpn-as-2.0.10-CentOS7.x86_64.rpm
5 history

由此可知,雖然執行兩次pwd,而且是非連續的,但是只保存了一條記錄。這樣就可以高效的使用歷史命令有限的存儲空間,但是如果你有需求要保留每次命令執行情況,以便日后審查,那就不能干了。

    空格隱去無用歷史命令

有沒有這樣一種需求?有些命令我執行了,但是我不想讓別人知道。實現這種需求有兩種方式:

一種是通過配置空格隱去無用歷史命令

二是通過配置指定某些命令需要隱去。

我們來先說第一種。首先,進行設置HISTCONTROL為ignorespace,如下所示:

$ export HISTCONTROL=ignorespace

作用是所執行命令以空格開頭,不做歷史記錄。執行命令如下:

$ history
$  pwd
$  cd 
$ ls

pwd和cd前面都增加了空格,history此時輸出:

1 history
2 ls
3 history

pwd和cd以空格開頭,而history和ls為正常輸入。此時記錄中只有history與ls。不過,個人感覺這種方式不是很好且具有不可控性,有可能產生誤操作導致想要的歷史命令丟失歷史等情況。那有沒有辦法指定某些命令被忽略,比如ls, history這些不想保留在歷史中。繼續往下看...

    指定忽略的命令

為了實現指定命令忽略,需要另外一個配置項:HISTIGNORE。如需要隱去ls, ls -l,pwd, history的執行記錄,可以通過如下設置:

$ export HISTIGNORE="pwd:ls:ls -l:history"

測試一下,先來按順序執行如下命令:

$ history
$ pwd
$ ls -l
$ ls Public/

然后看一下history的輸出結果:

1 ls Public/

我們執行了history, pwd, ls -l, ls Public/,但是記錄中我們只發現只有 ls Public/ 被記錄了下來。

突然覺得這個功能真的好強大,有效利用可以減少無用歷史命令的存儲,還可以啟到安全作用。當然,具體省略哪些命令要因人具體情況而定,也不能省略太多。

配置HISTFILE

通過配置HISTFILE可以改變記錄歷史命令的文件文件,默認/$HOME/.bashrc。這就不多說了。一般情況不會改變該文件的位置。

利用歷史命令快速編輯

上面說了那么多,主要是為了更高效的使用。接下來介紹些更牛的用法:

快速指定歷史命令

快速選中指定命令,一種是使用 ! ,通過命令執行順序編號或者通過命令開頭選中,二可以通過ctrl+r搜索快速選中,前面已作過介紹,不多說。下面看看第一種情況,假設此刻歷史命令如下:

1 ls Public/
2 export HISTCONTROL=erasedups
3 ls HISTCONTROL=erasedups
4 ls
5 history

我們直接通過示例來說明:

$ !1               // 執行命令為ls public
$ !-1              // 執行命令為history
$ !!               // 等同于!-1
$ !export          // 執行命令為export HISTCONTROL=erasedups

從上面可以看出,!的幾種常見用法:

!n 指定編號命令

!-n 倒序n處命令

!! !-1的簡寫,也就是最近的一條命令

!str 以str開頭的最近一條命令,這種方式str中不能存在空格,可使用ctrl+r快捷鍵代替。

快速選中指定參數

通常在執行命令時,參數的復雜度都大于命令自身。如果能夠實現快速選中命令的某個參數那就非常cool了。非常幸運,這也可以做到。假設歷史命令如下:

$ history
history
ls public/
ls example01 example02 public/
export HITCONTROL=erasedups
ls ~

示例說明:

    引用某命令的第一個參數 例如,引用第三條命令的第一個參數

$ ls -l !3:^

上述命令的效果相當于ls -l example01

例如,引用最新一條以export開頭的命令的第一個參數

$ ls -l !export:^

效果相當于ls -l HISTCONTROL=erasedups。我們可以記住一個簡寫,最近命令的第一個參數 !!:^ ,簡寫 !^。

    引用某條命令的最后一個參數

例如,引用第三條命令的最后一個參數

$ ls -l !3:$

效果相等于ls -l Public/。對于引用最新命令的最后一個參數同樣有 !!:和 ! 兩種簡寫。

    引用命令任意位置的參數

除了像開頭結尾這種特殊位置參數外,我們也可以引用任意位置參數。還是以上圖中的第三條命令為例,現在我希望引用此命令的第二個參數:

$ ls -l !3:2

如上面所示命令,此時的!3:2為example02。以此類推,簡單測試一下我們可以知道,!3:0為ls, !3:1為example01, !3:3為Public/。由此可以得出,分號之后的數字指定的就是命令參數的位置,從0計數。

    關于引用命令參數任意區間列表

除了指定某一個參數之外,選擇參數時,我們還可以指定參數區間,如選擇1-2位置的參數,開頭至結尾處的參數等。格式:cmd:offset1-offset2。 以第三條歷史命令為例,如下:

$ echo !3:^-$    // 打印全部參數列表,即example01 example02 Public/
$ echo !3:1-2    // 打印1至2位置參數,即example01 exmple02

從上面的示例,可以看出引用命令參數的格式通過分號分為兩部分,一是從哪條命令,二是哪個位置的參數。

歷史命令替換

歷史命令替換用處不多,也只在有比較長的命令比較高效,格式如下:

cmd:offset1-offset2:s/old/new/:s/old/new/

例如,替換歷史命令第3條命令參數example01位example1,example02為example2,Public為Work,如下:

$ echo !3:1-3:s/01/1/:s/02/2/:s/Public/Work/

如果比較熟悉vim的話,我們會發現某些操作和vim非常類似,比如這里的命令替換。

總結

這些技巧理解起來比較簡單,但是真正用好且確實提高效率是還需我們不斷實踐。介紹的部分功能是我們經常使用的,但也有些功能在平時工作中很少用到。但合理用好它們,在我們遇到一些特殊場景時,將會幫助我們更好解決問題。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/7223.html

相關文章

  • 打造高效個性Terminal(一)之 iTerm

    摘要:歡迎來我的博客閱讀打造高效個性一之打造高效個性二之前言作為一個集效率控顏值控強迫癥患者標簽于一身的患者,對待自己工作用到的,自然是諸多要求。簡介是一款免費的,專為用戶打造的命令行應用。新建窗口新建垂直新建水平新建打造高效個性二之 歡迎來我的博客閱讀:「打造高效個性Terminal(一)之 iTerm」「打造高效個性Terminal(二)之 zsh」 前言 作為一個集效率控、顏值控、強迫...

    jubincn 評論0 收藏0
  • Java 命令行交互輸入庫 JLine 入門

    摘要:實際上,中使用庫的軟件非常多,這使得同時也成為了一個事實上的命令行交互標準。對語言來說,就是這樣一個幫助你搭建一個命令行交互界面的庫。命令行會將用戶輸入的一行原樣打印出來。 我們都知道,軟件的用戶界面無非分為 GUI (圖形用戶界面)和 CLI (命令行用戶界面)。對于我們經常使用 Linux 的人來說,命令行界面一定非常熟悉。無論是 Shell 里輸入命令的界面,還是如 GDB 等軟...

    quietin 評論0 收藏0

發表評論

0條評論

entner

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<