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-}
никогда не будет.