使用預設值的參數替換:${1-str} 與 ${1-`echo str`}

使用預設值的參數替換:${1-str} 與 ${1-`echo str`}

${1-default_string_value}和有什麼區別${1-`echo default_string_value`}

為什麼使用第二種形式而不是第一種形式?

編輯:

我已經看到第二種形式在多個地方使用,例如作為相對廣泛傳播的 git 別名abbrev = !sh -c 'git rev-parse --short ${1-`echo HEAD`}' -

我的直覺是,第二種形式是透過修改現有的(例如Google搜尋)片段來使用的,這些片段必須使用命令作為預設值,但我可能會忽略一些東西,因此這個問題。

答案1

從功能角度來看,這沒有什麼差別。只是效率比較低而已。關於該程式碼的一些其他註解:

  • 它留下`...`並且${1...}不加引號,這意味著它們受到 split+glob 的影響,這裡沒有意義。
  • -$0對於該內聯腳本來說,的值是一個糟糕的選擇。例如,它會使錯誤訊息變得非常混亂。
  • `...`是已棄用的命令替換形式。$(...)現在是首選,儘管在這個特定情況下它沒有什麼區別。

另請注意,當命令包含 shell 元字元時 (|&;<>()$`\"' \t\n*?[#~=%",包括 sh 語言中分隔命令參數的 SPC),然後git執行 shell 來解釋別名並附"$@"在其後。所以,在這裡,我們最終運行了sh -c 'sh -c...'

為了進一步優化它,你可以將其更改為:

git config --global alias.abbrev '!
  abbrev() {
    exec git rev-parse --short "${1-HEAD}"
  }
  abbrev'

這節省了一些 fork 和 exec。

答案2

使用第二種形式可以讓事情變慢。

據了解,在我的機器上perf運行大約需要 300 萬個時脈週期。bash -c 'echo hello'進行命令替換的時間預計將少於此,但它仍然比僅擁有固定字串要多得多。

如果echo被替換為功能更多的東西,也許id -u它會為您提供覆蓋命令中的值的方法。這導致了使用第二種形式的第二個原因,可能是為了一致性 - 所有其他分配都是為了覆蓋命令,因此這裡使用 echo 作為命令。

相關內容