
${1-default_string_value}
との違いは何ですか?${1-`echo default_string_value`}
最初の形式ではなく 2 番目の形式を使用するのはなぜですか?
編集:
2番目の形式は、例えば比較的広く普及しているgitエイリアスとして、複数の場所で使用されているのを見たことがあります。abbrev = !sh -c 'git rev-parse --short ${1-`echo HEAD`}' -
私の直感では、この 2 番目の形式は、コマンドをデフォルト値として使用する必要がある既存の (たとえば、Google で検索した) スニペットを変更することによって使用されますが、何かを見落としている可能性があるため、この質問をしました。
答え1
機能的な観点からは違いはありません。単に効率が悪いだけです。このコードに関するその他の注意事項:
- 引用符が付いていないまま
`...`
な${1...}
ので、split+glob の対象になりますが、ここでは意味がありません。 -
は、そのインライン スクリプトの値としては不適切な選択です$0
。たとえば、エラー メッセージがかなりわかりにくくなります。`...`
はコマンド置換の非推奨形式です。$(...)
は、この特定の例では違いはありませんが、最近では好まれています。
また、コマンドにシェルのメタ文字(|&;<>()$`\"' \t\n*?[#~=%"
(sh言語ではコマンド引数を区切るSPCを含む)をgit
シェルに実行し、その値を解釈する。エイリアスを付加します"$@"
。したがって、ここでは を実行することになりますsh -c 'sh -c...'
。
さらに最適化するには、次のように変更します。
git config --global alias.abbrev '!
abbrev() {
exec git rev-parse --short "${1-HEAD}"
}
abbrev'
これにより、いくつかのフォークとエグゼクティブが節約されます。
答え2
処理速度を遅くするには、2 番目の形式を使用します。
perf
私のマシンで実行するには約 300 万クロック サイクルかかります。bash -c 'echo hello'
コマンド置換にはこれよりも短い時間で済むと期待していますが、それでも固定文字列を持つだけよりはるかに時間がかかります。
echo
が、より多くのことを実行する何かに置き換えられた場合、id -u
おそらく、コマンドからの値を上書きする方法が提供されるでしょう。これが、2 番目の形式を使用する 2 番目の理由につながります。それは、一貫性のためである可能性があります。他のすべての割り当ては、コマンドを上書きするためのものであるため、ここでは echo をコマンドとして使用します。