デフォルト値によるパラメータ置換: ${1-str} と ${1-`echo str`}

デフォルト値によるパラメータ置換: ${1-str} と ${1-`echo str`}

${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 をコマンドとして使用します。

関連情報