Недавно я заметил следующее в моем профиле cygwin, точнее:
/usr/local/bin:/usr/bin${PATH:+:${PATH}}
Что это означает? Почему не просто $ PATH? Это «если $ PATH существует, то добавить: $ PATH»? Моя цель - поменять порядок и поместить пути cygwin за путями Windows. В прошлом я бы
$PATH:/usr/local/bin:/usr/bin
но это меня смущает. Может быть, я должен делать
PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"
добавить: в конце $ PATH?
shell
path
variable-substitution
tofutim
источник
источник
Ответы:
:+
Является формой расширения параметра :Другими словами, если переменная
$var
определена,echo ${var:+foo}
она напечатает,foo
а если нет, то напечатает пустую строку.Второе
:
ничего особенного. Это символ, используемый в качестве разделителя в списке каталогов в$PATH
. Итак,PATH="/usr/local/bin:/usr/bin${PATH:+:${PATH}}"
это сокращенный способ написания:Это просто умный трюк, чтобы избежать добавления лишнего,
:
когда$PATH
он не установлен. Например:Но если
PATH
не установлено::
Сам по себе добавляет текущий каталог в$PATH
. ИспользованиеPATH="/new/dir${PATH:+:$PATH}"
избегает этого. Так что вы можете использовать,PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"
если хотите, или использовать,PATH="$PATH:/usr/local/bin:/usr/bin"
если хотите. Единственная разница в том, что первый может добавить дополнительный:
, тем самым добавив ваш текущий каталог в ваш$PATH
.источник
:
вред?$PATH
(см. ответ @ AndyB ). В некоторых ситуациях это может быть угрозой безопасности (например, злоумышленник загрузил деструктивный скрипт в ваш текущий каталог и назвал егоls
или что-то в этом роде), но в большинстве случаев вы действительно не против. Фактически, некоторые системыPATH
все равно добавляют текущий каталог в каталог по умолчанию.csh
обрабатывали путь, а не массив.Вы правы, это означает, что «если $ PATH существует - и не равен нулю - тогда добавьте: $ PATH».
Вам нужно проверить, существует ли $ PATH, потому что вы не хотите добавлять начальное (или конечное) двоеточие, если $ PATH не определено. Имя каталога нулевой длины (нулевое) в пути, как в
:/usr/local/bin:/usr/bin
, или/usr/local/bin:/usr/bin:
, или/usr/local/bin::/usr/bin
, означает поиск в текущем каталоге .Выдержка из
man bash
:Это, вероятно, не то, что вы хотите сделать.
Следующие две строки делают то же самое:
источник