使用默认值的参数替换:${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`}' -

我的直觉是,第二种形式是通过修改现有的(例如谷歌搜索)片段来使用的,这些片段必须使用命令作为默认值,但我可能会忽略一些东西,因此这个问题。

答案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 作为命令。

相关内容