
${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 作為命令。