Bash

有什麼區別一種nd!一種nd!_ and !?

  • March 24, 2021

我一直習慣於!$引用上一個命令的最後一個參數。

例如

~/dir » mkdir birthday
~/dir » cd !$
~/dir » cd birthday

但是我已經開始看到使用教程$_代替!$

我已經測試了這兩者,我注意到的唯一區別是微妙的,但它似乎$_會評估和執行命令,而!$會讓你在點擊之前檢查輸出Enter,但這是$_和之間的唯一區別!$嗎?

更新:標記為重複?這個問題可以通過建議問題的公認答案來回答,但這只是因為答案比要求的問題更詳細。

_ **$ 是什麼意思?**確實產生了建議的重複項,但是在詢問做了什麼之前我已經知道!$,並且沒有任何跡象表明該問題也可能回答其他問題。

執行man bash並蒐索特殊參數部分。因為_你會發現:

展開到前一個命令的最後一個參數,在展開之後

一個稍微詳細一點的版本可能是……

擴展為該命令接收到的前一個命令的最後一個參數,即在經過 Shell 擴展之後

而不是進一步解釋,我認為幾個例子真的會有所幫助。

範例 1

$ echo "$(date +%s)" # %s is seconds since epoch
1536984661
$ echo $_ !$ "$(date +%s)" # don't hit enter until a few seconds pass
1536984661 1536984665 1536984665

$_獲取傳遞給前面的實際值,echo因此它解析為過去的 seconds-since-epoch 值。同時,since!$被簡單地替換為最後一個參數的類型值,即"$(date +%s)",它解析為與它後面的參數相同的稍後時間。

範例 2

$ foo='a b c'
$ echo "$foo"  # expands to single arg: 'a b c'
a b c
$ echo "$_"
a b c
$ #---------
$ echo $foo    # expands to three args: a b c
a b c
$ echo "$_"
c

請注意,第二次$foo回顯它沒有被引用。因此,在傳遞給它之前,echo它經過了變數/參數擴展和分詞。該擴展/拆分導致abc作為三個單獨的參數傳遞給echo並且因為$_僅分配了我們僅看到的最後一個參數c。(如果!$使用abc仍會顯示,因為它只是替換為您輸入的值,即$foo。)

除了上述之外,$_vs還有一些更實用的價值,!$因為前者是一個變數。因此,例如,如果最後一個參數是/some/file/path.txt您可以獲取它的長度${#_} -> 19、僅提取文件名${_##*/} -> path.txt、更改根${_//some/other} -> /other/file/path.txt等。不能用!$.


最後,請注意$_在其他上下文中具有不同含義:

在 shell 啟動時,設置為用於呼叫在環境或參數列表中傳遞的 shell 或正在執行的 shell 腳本的絕對路徑名。

…和…

還設置為用於呼叫每個執行的命令並放置在導出到該命令的環境中的完整路徑名。

…和…

檢查郵件時,該參數保存目前正在檢查的郵件文件的名稱。

引用自:https://unix.stackexchange.com/questions/402444