Niedawno zauważyłem w moim profilu cygwin, a dokładniej:
/usr/local/bin:/usr/bin${PATH:+:${PATH}}
Co to znaczy? Dlaczego nie jest tylko ŚCIEŻKA $? Czy to jest „jeśli $ PATH istnieje, to dodaj: $ PATH”? Moim celem jest zamiana kolejności i umieszczenie ścieżek cygwin za ścieżką systemu Windows. W przeszłości miałbym
$PATH:/usr/local/bin:/usr/bin
ale to mnie dezorientuje. Może powinienem to robić
PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"
dołączyć: na końcu $ PATH?
shell
path
variable-substitution
tofutim
źródło
źródło
Odpowiedzi:
:+
Jest formą ekspansji parametrów :Innymi słowy, jeśli zmienna
$var
jest zdefiniowana,echo ${var:+foo}
wydrukuje,foo
a jeśli nie, wydrukuje pusty ciąg.Drugi
:
to nic specjalnego. Jest to znak używany jako separator na liście katalogów w$PATH
. Jest więcPATH="/usr/local/bin:/usr/bin${PATH:+:${PATH}}"
skrótowym sposobem pisania:To tylko sprytna sztuczka, aby uniknąć dodawania dodatkowych,
:
gdy$PATH
nie jest ustawiona. Na przykład:Ale jeśli
PATH
jest rozbrojony::
Sam dodaje aktualny katalog$PATH
. UżywaniePATH="/new/dir${PATH:+:$PATH}"
pozwala tego uniknąć. Więc na pewno możesz użyć,PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"
jeśli chcesz, lub możesz użyć,PATH="$PATH:/usr/local/bin:/usr/bin"
jeśli wolisz. Jedyna różnica polega na tym, że ten pierwszy może dodać dodatkowy:
, a tym samym dodać bieżący katalog do twojego$PATH
.źródło
:
szkodliwe?$PATH
(patrz @ AndyB za odpowiedź ). W niektórych sytuacjach może to stanowić zagrożenie bezpieczeństwa (powiedzmy, że osoba atakująca przesłała destrukcyjny skrypt do bieżącego katalogu i nadała mu nazwęls
lub coś takiego), ale w większości przypadków naprawdę nie masz nic przeciwko. W rzeczywistości niektóre systemy i tak dodają bieżący katalog doPATH
domyślnego.csh
obsługiwane przez tablicę.Masz rację, to znaczy „jeśli $ PATH istnieje - i nie ma wartości null - to dodaj: $ PATH”.
Musisz sprawdzić, czy $ PATH istnieje, ponieważ nie chcesz dodawać wiodącego (lub końcowego) dwukropka, jeśli $ PATH jest niezdefiniowany. Nazwa katalogu o zerowej długości (null) w ścieżce, jak w
:/usr/local/bin:/usr/bin
, lub/usr/local/bin:/usr/bin:
, lub/usr/local/bin::/usr/bin
oznacza wyszukiwanie w bieżącym katalogu .Wyciąg z
man bash
:Prawdopodobnie nie to chcesz zrobić.
Poniższe dwie linie robią to samo:
źródło