Parameterersetzung mit Standardwert: ${1-str} vs ${1-`echo str`}

Parameterersetzung mit Standardwert: ${1-str} vs ${1-`echo str`}

Was ist der Unterschied zwischen ${1-default_string_value}und${1-`echo default_string_value`}

Warum sollte man die zweite Form anstelle der ersten verwenden?

Bearbeiten:

Ich habe die zweite Form an mehreren Stellen gesehen, zum Beispiel als relativ weit verbreiteten Git-Aliasabbrev = !sh -c 'git rev-parse --short ${1-`echo HEAD`}' -

Mein Bauchgefühl sagt mir, dass diese zweite Form durch die Änderung vorhandener (z. B. gegoogelter) Snippets verwendet wird, die einen Befehl als Standardwert verwenden müssen, aber ich könnte etwas übersehen, daher diese Frage.

Antwort1

Aus funktionaler Sicht macht es keinen Unterschied. Es ist nur weniger effizient. Einige weitere Anmerkungen zu diesem Code:

  • Es lässt `...`und ${1...}ohne Anführungszeichen, was bedeutet, dass sie Split+Glob unterliegen, was hier keinen Sinn ergibt.
  • -ist eine schlechte Wahl für den Wert $0dieses Inline-Skripts. Es würde beispielsweise zu ziemlich verwirrenden Fehlermeldungen führen.
  • `...`ist die veraltete Form der Befehlsersetzung. $(...)wird heutzutage bevorzugt, obwohl es in diesem speziellen Fall keinen Unterschied machen würde.

Beachten Sie auch, dass, wenn der Befehl Shell-Metazeichen enthält (|&;<>()$`\"' \t\n*?[#~=%", einschließlich SPC, das in der Sprache sh Befehlsargumente abgrenzt), gitführt dann eine Shell aus, um den Wert desaliasmit "$@"angehängt. Hier führen wir also aus sh -c 'sh -c...'.

Zur weiteren Optimierung können Sie es wie folgt ändern:

git config --global alias.abbrev '!
  abbrev() {
    exec git rev-parse --short "${1-HEAD}"
  }
  abbrev'

Das erspart einige Forks und Execs.

Antwort2

Verwenden Sie die zweite Form, um die Dinge langsamer zu machen.

Laut Angaben perfdauert es auf meinem Rechner etwa 3 Millionen Taktzyklen, um bash -c 'echo hello'es auszuführen. Die Befehlsersetzung dauert hoffentlich weniger, aber es wird immer noch viel mehr sein, als nur die feste Zeichenfolge zu haben.

Wenn echoes durch etwas ersetzt würde, das mehr kann, id -ukönnte es Ihnen vielleicht eine Möglichkeit bieten, den Wert des Befehls zu überschreiben. Dies führt zum zweiten Grund für die Verwendung der zweiten Form, möglicherweise aus Konsistenzgründen – jede andere Zuweisung dient zum Überschreiben eines Befehls, also verwenden Sie hier echo als Befehl.

verwandte Informationen