天天看點

Bash 強大的History 指令

Bash的使用GUN readline庫來處理使用者輸入,是以BASH也有emacs/vi 兩種模式(主要是快捷鍵不同)(4DOS沒有)

一般來說BASH預設是emacs模式,如果想變成vi模式(如果你是vi使用者)就可以了,然後你就可以用和vi一樣的快捷鍵來編輯指令行了.(4DOS沒有)

set -o vi

不好意思有點遠了,接下來還是history指令方面

Emacs and Vi history 編輯快捷鍵:

Emacs 模式:

CTRL-p 曆史清單上一個.

CTRL-n 曆史清單下一個.

CTRL-r 向上搜尋曆史清單 (incremental search).

CTRL-s 向下搜尋曆史清單 (incremental search).

Meta-p 向上搜尋曆史清單 non-incremental search.

Meta-n 向下搜尋曆史清單using non-incremental search.

Meta-Meta-> 移動到曆史清單末尾.

Vi 模式:

k 曆史清單上一個.

j 曆史清單下一個.

/string or CTRL-r 向上搜尋曆史清單(正規表達式).

?string or CTRL-s 向下搜尋曆史清單(正規表達式).

n  重複上次搜尋(同方向)n次

N 重複上次搜尋(反方向)n次

G 移動到曆史清單第N行 (for example, 15G).

/*

* 題外話,linux/unix的系統設計原則是KISS,和M$系統不一樣,兩個系統理念完全相反。

* 同時M$一個公司控制,是以什麼事情都大都是一個程式解決所有問題

* linux/unix系統,不是一個工具解決所有問題,是一個工具解決一個問題,多個工具融合解決複雜問題

* 是以大家的使用理念也不應該要求一樣

* M$使大家變懶了,但是初學簡單,兩點間基本一條路,入門快,提高慢

* linux/unix相反,東西多,路子廣,兩點之間多條路徑,入門慢,提高快

*/

History 擴充(太靈活了):

Event Designators:

! 開始曆史指令代換.

!! 上一條指令.

!n 上n條指令.

!-n 目前指令行數-n.

!string 最近的以string開頭的曆史指令.

!?string? 最近的包含string的曆史指令 (後一個 ? 可省).

^string1^string2^  快速代換,重複上條指令,用string2替換string1.

!# 重複目前已經輸入的指令行.

Word Designators (word designators follow the event designators, separated by a colon):

0 指令行第0個參數(恩,和c/shell 相似,通常是指令的名字,不知道 c/shell?那當我沒說).

n 指令行第n個參數.

^ 指令行第一個參數 (第二個單詞)

$ 指令行最後一個參數.

% 上次?string?搜尋比對的單詞.

x-y x-y的參數 (-y等價于0-y).

* 所有參數(就是不包括指令的名字).

x* 與x-$相同.

x- x到倒數地二個參數

.

Modi ers (modi ers follow word designators, separated by a colon):

h 删除所有後面的路徑,隻留下前面的

t 删除所有前面的路徑,隻留下後面的

r 删除字尾.xxx, 留下檔案名

e 删除檔案名, 留下字尾

p 列印結果指令,但不執行(恩,測試功能)

q 防止代換參數被再次替換(Quotes the substituted words, escaping further substitutions.這是原文)

x Quotes the substituted words, breaking them into words at blanks and newlines.

s/old/new/ 字元串替換(正規表達式,又沒聽過?當我沒說)

& 重複上次替換

g 在目前行的所有單詞範圍執行s或者&指令(正則.....,算了).

下面是例子

History expansion examples:

$ echo a b c d e (executes `echo ab c d e`)

a b c d e

$ echo !!:3-$ (executes `echo c d e`)

c d e

$ echo !-2:*:q (executes `echo 'a b c d e'`)

$ echo !-3:1:2:4:x (executes `echo 'a' 'b' 'd'`)

a b d

$ echo !-4:1-3:s/a/foo/:s/b/bar/:s/c/baz/

(executes `echo foo bar baz`)

foo bar baz

上面這些+小小的技巧+小g,應該能實作4DOS的所有功能了把?

什麼?還是不成,那你不适合linux/unix

繼續閱讀