Замена параметра со значением по умолчанию: ${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`}' -

Мое внутреннее чувство подсказывает, что эта вторая форма используется путем изменения существующих (например, найденных в Google) фрагментов, которые должны использовать команду в качестве значения по умолчанию, но я мог что-то упустить из виду, поэтому и задаю этот вопрос.

решение1

С функциональной точки зрения это не имеет значения. Это просто менее эффективно. Некоторые другие замечания по этому коду:

  • он оставляет `...`и ${1...}без кавычек, что означает, что они подлежат разделению+подстановке, что здесь не имеет смысла.
  • -плохой выбор значения $0для этого встроенного скрипта. Например, это сделало бы сообщения об ошибках довольно запутанными.
  • `...`— устаревшая форма подстановки команд. $(...)В настоящее время она предпочтительна, хотя в данном конкретном случае это не имеет значения.

Также обратите внимание, что когда команда содержит метасимволы оболочки (|&;<>()$`\"' \t\n*?[#~=%", включая SPC, который в языке sh разделяет аргументы команды), затем gitзапускает оболочку для интерпретации значенияпсевдонимс "$@"присоединенным к нему. Итак, здесь мы заканчиваем запуском sh -c 'sh -c...'.

Для дальнейшей оптимизации вы можете изменить его на:

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

Что экономит несколько вилок и руководителей.

решение2

Используйте вторую форму, чтобы замедлить процесс.

Согласно ему, на моей машине perfдля выполнения требуется около 3 миллионов тактов bash -c 'echo hello'. Надеюсь, что для подстановки команд потребуется меньше времени, но это все равно будет намного больше, чем просто фиксированная строка.

Если echoбыло заменено чем-то, что делало больше, возможно, id -uэто предоставит вам способ переопределить значение из команды. Это приводит ко второй причине использования второй формы, это может быть для согласованности — каждое другое назначение предназначено для переопределения команды, поэтому здесь используйте echo в качестве команды.

Связанный контент