${1-default_string_value}
和有什么区别${1-`echo default_string_value`}
为什么使用第二种形式而不是第一种形式?
编辑:
我已经看到第二种形式在多个地方使用,例如作为相对广泛传播的 git 别名abbrev = !sh -c 'git rev-parse --short ${1-`echo HEAD`}' -
我的直觉是,第二种形式是通过修改现有的(例如谷歌搜索)片段来使用的,这些片段必须使用命令作为默认值,但我可能会忽略一些东西,因此这个问题。
答案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 作为命令。