Bash中強大的History 命令

2021-05-22 01:26:50 字數 2713 閱讀 9762

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 刪除字尾.***, 留下檔名

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'`)

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

Bash 強大的History 命令

bash的使用gun readline庫來處理使用者輸入,所以bash也有emacs vi 兩種模式 主要是快捷鍵不同 4dos沒有 一般來說bash預設是emacs模式,如果想變成vi模式 如果你是vi使用者 就可以了,然後你就可以用和vi一樣的快捷鍵來編輯命令列了.4dos沒有 set o vi...

bash 中的括號

命令組。括號中的命令將會新開乙個子shell順序執行,所以括號中的變數不能夠被指令碼餘下的部分使用。括號中多個命令之間用分號隔開,最後乙個命令可以沒有分號,各命令和括號之間不必有空格。命令替換。等同於 cmd shell掃瞄一遍命令列,發現了 cmd 結構,便將 cmd 中的cmd執行一次,得到其標...

bash中的陣列

定義 array 1 two 3 four array index value 訪問陣列元素 array必須用大括號括起來 獲取陣列所有元素 元素之間以空格分隔 獲取陣列長度 按下標遍歷 for i in seq 1 do echo i,done 按元素遍歷 必須加雙引號 for var in 注 ...