Що означає $ {PATH: +: $ {PATH}}?


25

Нещодавно я помітив наступне у своєму профілі 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?


1
Заголовок вашого запитання справді переплутався з форматуванням у бічній панелі гарячих питань SE i.imgur.com/g6pPmzf.png
Бред

Відповіді:


39

:+Є формою розширення параметра :

$ {параметр: + [слово]} : Використовуйте альтернативне значення.

Якщо параметр не встановлений або недійсний, нуль заміняється; в іншому випадку розширення слова (або порожній рядок, якщо слово пропущено) заміняється.

Іншими словами, якщо змінна $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:

A :сам додає поточний каталог до $PATH. Використання PATH="/new/dir${PATH:+:$PATH}"уникає цього. Отже, ви можете використовувати, PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"якщо хочете, або ви можете використовувати, PATH="$PATH:/usr/local/bin:/usr/bin"якщо хочете. Єдина відмінність полягає в тому, що перший може додати додатковий :, тим самим додавши поточний каталог у свій $PATH.


Чи зайвий :шкідливий?
кіт

4
@tac не дуже, він просто додає поточний каталог до вашого $PATH(див @ AndyB в відповідь ). Це може становити загрозу безпеці в деяких ситуаціях (скажімо, зловмисник завантажив руйнівний скрипт у вашу поточну каталог і назвав його lsчи щось), але в більшості випадків ви насправді не проти. Насправді, деякі системи так PATHчи інакше додають поточний каталог до типового.
тердон

шлях - це одне місце, де я вважаю за краще, щоб вони cshобробляли його тоді як масив.
рідний берест

8

Ви правильні, це означає "якщо $ PATH існує - і не є нульовим - тоді додайте: $ PATH".

Вам потрібно перевірити, чи існує $ PATH, тому що ви не хочете додавати провідної (або кінцевої) двокрапки, якщо $ PATH не визначено. Ім'я каталогів нульової довжини (null) на шляху, як у :/usr/local/bin:/usr/bin, або /usr/local/bin:/usr/bin:, або /usr/local/bin::/usr/bin, означає пошук у поточному каталозі .

Витяг із man bash:

   PATH   ...
          A zero-length (null) directory name in the value of PATH indicates 
          the current directory.  A  null  directory name may appear as two 
          adjacent colons, or as an initial or trailing colon.
          ...

Мабуть, це не те, що ти хочеш робити.

Наступні два рядки роблять те саме:

PATH=":/bin"        # search current directory, then /bin
PATH=".:/bin"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.