
В чем разница между ${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 в качестве команды.