2015-10-30 53 views
5

zsh和bash之類的shell有bang命令,它們以感嘆號開頭並展開到用戶歷史記錄中的項目。如何在bash中交互式地展開bang命令?

爲了得到最後運行的命令的最後一個參數,可以使用!$,例如,

$ echo one two three 
$ echo !$ !$ !$ 
> three three three 

在zsh的,能夠擴大這些砰交互式命令:

touch foo bar 
ls !$<TAB> 

!$將擴大到foo內聯。

這是非常有用的,因爲它經常阻止我從錯誤:我按tab展開並確保我得到它正確和C-/撤消擴展時,我有信心。

在bash中是否有設置來實現bang命令的交互式擴展?

什麼子shell和一般變量的擴張爲此事(即echo $(uname)<TAB>echo Linuxecho $SHELL<TAB>echo /bin/bash)。

+0

你的問題的前提是讀者明白zsh中的bang命令是什麼。如果您描述了您之後的功能,則可能可以覆蓋更廣泛的受衆羣體。我猜M-。前綴參數接近你想要的,但我沒有搜索到。 – tripleee

+2

http://structure.usc.edu/bash/bashref_8.html#SEC106解釋了可用的綁定。 M-C-e會進行一般擴展,所以或多或少地出現在第二個問題中。 (請在將來每個帖子只有一個問題!) – tripleee

+0

我擴大了一下我的意思是與砰的命令。 我認爲subhell,變量等機制是相同的,這就是爲什麼我包括問題的第二部分。 你說得對,謝謝,'shell-expand-line'確實是我在找的東西。 – kba

回答

8

有幾個選項可以用於歷史擴展。一個是:p修飾符,它將打印擴展的命令而不是執行它。

$ echo foo 
$ !!:p 
echo foo 

另一個是使用histverify選項,這使結果歷史擴展的在殼緩衝器進行編輯而不是立即執行它的。

$ shopt -s histverify 
$ echo foo 
foo 
$ !! 
$ echo foo 

如果您對該命令感到滿意,只需再次按下Enter鍵即可執行該命令,就像剛剛輸入它一樣。

默認情況下,加入了Readline命令history-expand-line勢必M-^Alt-^Esc-^,取決於你的終端模擬器將作爲元鍵),它擴展了當前命令行上的任何歷史擴張。

還有一個普遍的ReadLine命令shell-expand-line(默認綁定到M-C-e),擴展在命令行上一切,就像外殼會按下回車鍵,但之前實際執行它之後。

+1

'shell-expand-line' readline命令是我正在尋找的。 'shopt -s histverify'也非常有用,謝謝。正如@tripleee在註釋中指出的那樣,獲取最後一個命令(即'!$')的最後一個參數的快捷方式是'M-.'('Alt + .'或'Esc-.')。 – kba

+1

'Ctrl-x'也可以擴展該行(不執行)。 –