91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

bash 的歷史擴展功能是什么

發布時間:2022-01-07 09:56:06 來源:億速云 閱讀:130 作者:柒染 欄目:系統運維

今天就跟大家聊聊有關bash 的歷史擴展功能是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

Bash 的歷史擴展(History Expansion)又被稱為 Bang(!) 命令,歷史擴展是 bash 將歷史命令轉換到可執行命令的過程。Bash 下的 History 庫提供了一個與 csh 下歷史擴展類似的歷史擴展功能。歷史擴展中操作歷史命令一般有兩個部分:

  1. 首先要從歷史命令中找出相對應的命令,被選擇到的命令我們稱作為Event(條目),比如Bang Bang(!!),就是選擇最后一條命令;

  2. 選擇選定行的部分或全部文本以包含到當前行中。要操作的條目(Event)Bash將其拆分成了Words(詞),命令中的Words是靠空格來分割的,我們就可以使用修飾符(Modifiers)來調整Words以符合我們的要求。注意:Words并不是英文單詞,而是一個字符序列而已。

先來看兩個命令,你知道第二個命令是什么意思么?

cat /tmp/cat.cat.txt!:0 !*:gs/cat./echo.

條目標志符(Event Designators)

條目標志符是一個到歷史列表內一個命令行實體的引用,除非是絕對引用,不然條目的引用是相對歷史列表中當前位置的。

條目標志符條目標志符說明
!開始一個歷史替換,除非后面緊跟的是空格,制表符,行結束符,"=","("(當使用內建命令shopt開啟了extglob的shell選項)。
!n重復歷史中編號為n的命令——歷史編號可以參看history命令.
!-n執行之前的第n條命令,執行上一條命令可以使用!!或者!-1,執行之前第三條命令:!-3,倒推的列表是history
!!執行上一條命令,和Ctrl-P,!-1的作用一樣。
!string執行最近的以string字串開頭的命令。這個命令的意思是重復以!后字串開頭的最后一條命令,比如:!ca將重復以字符ca開頭的最后一條命令,如cat ReadMe,(假設最近一條ca開頭是這個命令,并且ReadMe后緊跟換行符)
!?string[?]在歷史列表中以當前位置開始向后查找(往回搜索)包含string字符串的最近一條命令,如果要查找的string字符串后面緊跟換行符,則string后面的這個問號可以省略。例如:!?Read?還是會匹配cat ReadMe。(同上的環境),如果后面是換行符如:!?ReadMe,則不用輸入結尾的[?]。
^a^b快速替換,把上一條命令中的a替換成b,并執行替換后的命令。^a^b^類似。注意:這里只是替換一個找到的實例,相當于:!!:s/a/b
^abc刪除上一條命令中的abc。
!#引用目前輸入的所有字串,如:more a !#;這個最終的命令是more a more a

詞標志符(Word Designators)

詞標志符被用來在條目里面選擇需要的詞。一般用":"分隔條目指示符和詞指示符。當詞指示符是以"^","$","*","-","%"開頭時,也可能會省略":"。詞是從一行的行首開始,第一個詞編號為0.插入到當前行中時,這些詞使用單個空格分隔。

詞標志符詞標志符說明
0第0個詞,在很多應用程序中,這就是命令本身。
n第n個詞
^第一個參數;也就是第一個詞。
$最后一個參數。
%最近"?string?"匹配的詞。
x-y詞的范圍:如果是'0-y'可以簡寫成'-y'.
*除了第0個以外的所有詞,這個和'1-$'同義,如果條目中只有一個詞,使用'*'也不會返回錯誤,僅是返回一個空字符串而已。
x*'x-$'的簡寫
x-和x*類似,都是'x-$'的簡寫,不過需要注意,這個寫法是忽略最后一個詞的。

需要注意的是,在Bash下使用詞指示符的時候,可以沒有條目指示符,如果沒有使用條目指示符,則會把前一條命令作為詞指示符的操作條目。

修飾符(Modifiers)

在可選的詞指示符之后,你可以添加下面修飾符中的一個或多個,每個修飾符以':'開頭。

修飾符修飾符說明
h去掉路徑名的尾部,只保留頭部。只移除最后一個'/'后面的內容,可以理解成是路徑名的父目錄。
t去掉路徑名部件中除尾部之外的所有內容。只保留最后一個'/'后的內容。
r去掉尾部這樣格式".suffix"的一個結尾后綴,保留基本名稱。只刪除最后一個點'.'后的內容。
e僅保留后綴。僅保留最后一個點'.'及點后的內容。
p打印新的命令但不執行。
q引用替換的詞,防止進一步替換。(譯注,原文:Quote the substituted words, escapin further substitutions.——Mitchell Chu)。這個引用會直接對引用的命令加上單引號,防止進一步替換。開始這句不知道怎么翻譯。后來Mitchell發現自己的這個翻譯并沒有錯誤,因為我們引用的詞可能是個變量,這時候如果沒有引號,就會引起進一步的替換,而是用此參數就能達到防止這種情況的發生。
x這個和q一樣,是引用替換的詞,但是這個與q不同的地方在于,q是整體引用,而這個是會將替換的詞使用空格,制表符,換行符來分割成一個個的詞。
s/old/new/把條目行中找到的第一個old位置的內容替換成new位置的內容,'/'這個分隔符位置可以使用任何其他字符作為分隔符。如果要在old或new位置使用分隔符,需要使用反斜桿'\'來轉義。如果'&'這個字符出現在new位置,將會被替換成old位置的內容,如果要使用'&'請用'\'轉義。最后一個分隔符如果是整行的最后一個字符,則可以省略。
&重復上次替換。這個是引用最后一次的s/old/new/內容。
g見下,與a相同
a使替換在整個條目中進行,和's'一起使用,例如:!!:gs/old/new/,或者和'&'一起使用。
G

對條目中的每一個詞都執行一次其后的's'修飾符。這個方法在Bash 4.1.2下測試并不靠譜。

test $eee /tmp/test.logecho !test:Gs/t/a/;## 這個返回的test被替換兩次## 但后面的參數僅替換一次

因此Mitchell在想,是不是僅對參數執行一次,而對命令(第0個詞)進行全局替換。但另外一個測試,反駁了這個觀點:

aaaaaaaaaaa $aaaaaaa /tmp/aaaaaaaaaaaaa.logecho !aaaa:q:Gs/a/t/## 此時,最多的替換出現在!:0,兩次!

但多次測試結果來看,第零個詞匯被替換最多兩次,其他只替換一次。具體原因暫時未知!

了解了這些,我們來揭曉一下文章開頭的命令的意義:

  1. 我們首先是選出命令!!(!:0可以寫成!!:0,!*同樣可以寫成!!*)

  2. 有了命令之后我們選擇第二步,利用0,選擇出詞(!:0選擇出來的是cat)

  3. 第三步是對詞進行操作,這里是!*后面對參數進行了字符替換。

  4. 最后變成完成的命令了: cat /tmp/echo.echo.txt

看完上述內容,你們對bash 的歷史擴展功能是什么有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

内江市| 乐至县| 社旗县| 濮阳县| 泸西县| 镇安县| 平阳县| 鄱阳县| 汝城县| 郴州市| 龙江县| 扎赉特旗| 鄂托克前旗| 宜兰市| 两当县| 福鼎市| 资溪县| 曲水县| 如皋市| 巴南区| 泾川县| 来凤县| 志丹县| 西丰县| 长寿区| 凯里市| 宁陕县| 富蕴县| 富民县| 安阳县| 延庆县| 嘉荫县| 万荣县| 呼图壁县| 德昌县| 万安县| 株洲市| 正阳县| 潞城市| 乌兰浩特市| 东平县|