bash參數 - 如何使用前一個命令的參數?



bash-c option (6)

我知道Esc + 給你最後一個命令的最後一個參數。

但我對最後一個命令的第一個參數感興趣。 有沒有一個關鍵的綁定來做到這一點?

同樣的道理,是否有從最後一個命令獲得第n個參數的通用方法? 我知道在bash腳本中,可以使用$0$1等,但這些命令行不起作用。

另外,如何迭代前面命令的第0個參數,就像我們通過連續按下Esc +所做的最後一個參數一樣


Answer #1

!^可能是第一個參數的命令。 我不確定是否有辦法獲得第n個。


Answer #2

!$獲取前一個命令行參數的最後一個元素。


Answer #3

基本上它有一個使用先前的 (命令) 參數

例如,如果發出以下命令:

echo Hello, world how are you today?

那麼, Hello,將是第一個參數, today? 第六 ,這是最後一個; 這意味著可以通過鍵入來引用它:

Alt + 6,然後按Ctrl-Alt-6

傳統上, Ctrl表示為鍵名稱前面的帽子字符, Alt表示M-前綴。

所以上面的快捷方式可以重新定義為^My可以被抽出。

另外,命令行中有帽子替換快捷方式:

echo Hello, world!

^Hello^Bye

Bye, world!

用前一個命令的第一個匹配的字符串替換,意思是:

Hello, world! Hello, people!

^Hello^Bye

會導致:

Bye, world! Hello, people!

留下第二場比賽( hello )不變。

注意:不要在帽子之間留下空間 ,否則操作不起作用。

以上只是一個捷徑:

!:s/Hello/Bye

事件級(*)替換上一個命令中第一個找到的(匹配的)字符串,而用g開關在第一個部分前加上字母g將適用於整行 g

echo Hello, world! Hello, people!

!:gs/Hello/Bye

Bye, world! Bye, people!

通常在其他相關的命令如sedviregex (正則表達式)中完成 - 這是一種標準的搜索方式( 匹配字符串 )。

不,你做不到!:sg/Hello/Bye!:s/Hello/Bye/g在這裡,這就是語法

  • ! 是為了事件; 事件可能被理解為在命令歷史記錄中完成的命令輸出或操作。

這就是我通過自己使用它並根據我從包括手冊頁,博客和論壇在內的各種來源閱讀的內容嘗試自己的事情所了解的內容。

希望它能揭示神秘的bash ,Bourne-Again shell( sh shell中的一個玩法,它本身在發明者的姓氏之後被稱為Bourne shell),什麼是許多發行版中的默認shell,包括服務器( 服務器操作系統 ) 。


Answer #4

就像M-. (meta-dot或esc-dot或alt-dot)是readline函數yank-last-argMCy (meta-control-y或esc-ctrl-y或ctrl-alt-y)是readline函數yank-nth-arg 。 如果沒有指定n ,它會刪除前一個命令的第一個參數。

要指定參數,請按Escape和數字,或按住Alt並按數字。 你可以做Alt - -開始指定一個負數,然後釋放Alt並按數字(這將從參數列表的末尾算起。

例:

輸入以下命令

$ echo a b c d e f g
a b c d e f g

現在在下一個提示符處,輸入echo (以下空格),然後

Alt - Ctrl - y ,你現在可以看到:

$ echo a

無需按Enter鍵 ,請執行以下操作

按下Alt - 3 Alt - Ctrl - y

按下Alt - - 2 Alt - Ctrl - y

現在你會看到:

$ echo ace

順便說一下,你可以通過選擇參數0來將echo放在行上:

Alt - 0 Alt - Ctrl - y

編輯:

要回答您添加到原件中的問題:

您可以按Alt - 0,然後反复按Alt - 以遍歷前面的命令(參數0)。 同樣的Alt - -然後重複Alt - 將允許您逐步瀏覽先前的倒數第二個參數。

如果歷史上某一行沒有適當的論點,鐘會響起。

如果您經常使用某種特定的組合,則可以定義一個宏,以便一個按鍵可以執行該宏。 這個例子將通過按下Alt - Shift - Y來回憶以前命令的第二個參數。 您可以選擇任何可用的按鍵,而不是此選項。 您可以重複按下以逐步瀏覽以前的內容。

要試用它,請在Bash提示符處輸入宏:

bind '"\eY": "\e2\e."'

為了使其持久,請將此行添加到~/.inputrc文件中:

"\eY": "\e2\e."

不幸的是,這似乎不適用於參數0或負數參數。


Answer #5

接受答案末尾描述的方法也適用於我的第零個論點。 我在~/.inputrc有這些行:

"\en": "\e0\e."
"\em": "\e1\e."
"\e,": "\e2\e."

\e2\e.\e2\e\Cy有優勢,如果它重複按下而不是先前命令的第二個參數多次插入,它將循環前面的命令。

要插入整個以前的命令,可以鍵入!!\e^\e^history-expand-line


Answer #6

要使用第一個參數,可以使用!^!:1

例:

$ echo a b c d e 
a b c d e
$ echo !^
echo a
a

$ echo a b c d e 
a b c d e
$ echo !:1
echo a
a

由於你的問題是關於使用任何其他參數,下面是一些有用的參數:

!^      first argument
!$      last argument
!*      all arguments
!:2     second argument

!:2-3   second to third arguments
!:2-$   second to last arguments
!:2*    second to last arguments
!:2-    second to next to last arguments

!:0     the command
!!      repeat the previous line

前四種形式更常用。 形式!:2-有點違反直覺,因為它不包含最後一個參數。





input-history