:+
Является формой расширения параметра :
$ {параметр: + [слово]} : использовать альтернативное значение.
Если параметр не установлен или ноль, ноль должен быть заменен; в противном случае расширение слова (или пустая строка, если слово опущено) должно быть заменено.
Другими словами, если переменная $var
определена, echo ${var:+foo}
она напечатает, foo
а если нет, то напечатает пустую строку.
Второе :
ничего особенного. Это символ, используемый в качестве разделителя в списке каталогов в $PATH
. Итак, PATH="/usr/local/bin:/usr/bin${PATH:+:${PATH}}"
это сокращенный способ написания:
if [ -z "$PATH" ]; then
PATH=/usr/local/bin:/usr/bin
else
PATH=/usr/local/bin:/usr/bin:$PATH
fi
Это просто умный трюк, чтобы избежать добавления лишнего, :
когда $PATH
он не установлен. Например:
$ PATH="/usr/bin"
$ PATH="/new/dir:$PATH" ## Add a directory
$ echo "$PATH"
/new/dir:/usr/bin
Но если PATH
не установлено:
$ unset PATH
$ PATH="/new/dir:$PATH"
$ echo "$PATH"
/new/dir:
:
Сам по себе добавляет текущий каталог в $PATH
. Использование PATH="/new/dir${PATH:+:$PATH}"
избегает этого. Так что вы можете использовать, PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"
если хотите, или использовать, PATH="$PATH:/usr/local/bin:/usr/bin"
если хотите. Единственная разница в том, что первый может добавить дополнительный :
, тем самым добавив ваш текущий каталог в ваш $PATH
.