
我有一個名為 的腳本cpodin
,它將多個建置工件複製到另一個目錄。然後,我SHA1SUM
在目標目錄中進行編輯。
例如:
cpodin /foo/bar/baz
vim !$/SHA1SUM
如何使後一個指令的別名fixsha
不帶參數,並SHA1SUM
在前一個指令的最後一個參數命名的目錄中進行編輯?別名為
alias fixsha='vim !$/SHA1SUM'
結果嘗試編輯!$/SHA1SUM
而不是/foo/bar/baz/SHA1SUM
.
答案1
Bash 在別名擴展後不會執行歷史擴展,因此您必須使用明確執行此操作history
,並記錄於Bash 歷史內建函數並摘錄如下。
history -ps args
-p
執行歷史替換參數並將結果顯示在標準輸出上,而不將結果儲存在歷史清單中。-s
args 作為單一條目新增到歷史清單的末尾。
的別名alias fixsha='vim $(history -p !$)/SHA1SUM'
在大多數情況下都可以工作,但在!$
擴展為包含空格的路徑時卻無法達到預期效果。在路徑參數周圍添加雙引號將保護空格上的任何轉義,並導致vim "/foo/bar\ baz/SHA1SUM"
而不是所需的vim /foo/bar\ baz/SHA1SUM
或其等效的vim "/foo/bar baz/SHA1SUM"
.
所以除了顯式的歷史擴展之外,eval
還需要解開一層引用。
alias fixsha='eval vim "$(history -p !$)/SHA1SUM"'
筆記:您可能會驚訝地發現上述別名定義中的雙引號是不必要的。這是因為!$
和的擴展值之間沒有空格/SHA1SUM
來觸發 bash 的分詞。然而,我喜歡他們在那裡強調它正在擴展到單一論點的意圖。