如何寫 bash 別名來將 !$ 替換為上一個指令的最後一個單字?

如何寫 bash 別名來將 !$ 替換為上一個指令的最後一個單字?

我有一個名為 的腳本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 的分詞。然而,我喜歡他們在那裡強調它正在擴展到單一論點的意圖。

相關內容