if [ -n "${BASH-}" -o -n "${ZSH_VERSION-}" ] ; then
hash -r 2>/dev/null
fi
Где я могу найти ссылку на это? Спасибо.
if [ -n "${BASH-}" -o -n "${ZSH_VERSION-}" ] ; then
hash -r 2>/dev/null
fi
Где я могу найти ссылку на это? Спасибо.
Переменные внутри ${...} называются "Расширение параметров".
Ищите этот термин в электронном руководстве или в настоящем руководстве (строка 792).
Форма ${var-} похожа по форме на ${var:-}. Разница объясняется всего за одну строку до расширения :- (строка 810):
... bash проверяет наличие неустановленного или нулевого параметра. Опуская толстую кишку приводит к проверке только для параметра, который не установлен.
Таким образом, эта форма проверяет только, когда переменная не установлена (и не ноль), и заменяет все расширение ${...} на значение после -, которое в этом случае равно нулю.
Следовательно, ${var-} становится:
'', таким образом: также null.''), если переменная не установлена.Все это только на самом деле:
'', когда var либо не установлен, либо равен нулю.Следовательно, расширение ничего не меняет ни в значении var, ни в расширении, оно просто избегает возможной ошибки, если в оболочке установлена опция nounset.
Этот код остановится в обоих случаях использования $var:
#!/bin/bash
set -u
unset var
echo "variable $var"
[[ $var ]] && echo "var set"
Однако этот код будет работать без ошибок:
#!/bin/bash
set -u
unset var
echo "variable ${var-}"
[[ ${var-} ]] && echo "var set"
Это расширение параметра bash, которое используется для проверки того, не установлена ли переменная
Когда вы используете ${ZSH_VERSION-WORD} вместо $ZSH_VERSION в bash script, bash будет выполнять дополнительную логику
if $ZSH_VERSION is set
then
simply use the value of $ZSH_VERSION as per normal
elseif
$ZSH_VERSION is NOT set
then
use value of WORD - which isnt provided in your case - so null
используется
Расширение базового параметра описано в документах man bash
(строка 939 справочной страницы bash).
см.: POSIX
также см. этот SO ответ
В нормальных условиях ${FOO-} ведет себя точно так же, как ${FOO}.
Однако, при set -u, разблокирование неустановленных переменных становится ошибкой по умолчанию.
Так что ${FOO} может быть ошибкой, но ${FOO-} никогда не будет.