Muszę dołączyć katalog do PKG_CONFIG_PATH
. Normalnie użyłbym standardu
export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:$(pyenv prefix)/lib/pkgconfig
ale PKG_CONFIG_PATH
nie zostało wcześniej ustawione w moim systemie. Dlatego zmienna zaczyna się od :
znaku, który każe jej najpierw zajrzeć do bieżącego katalogu. Nie chcę tego. Ustaliłem, co następuje:
export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}${PKG_CONFIG_PATH:+:}$(pyenv prefix)/lib/pkgconfig
ale to wydaje się takie brzydkie. Czy jest lepszy sposób? Jaki jest właściwy sposób warunkowego dołączenia dwukropka, jeśli i tylko wtedy, gdy zmienna została już ustawiona?
bash
variable-substitution
scottbb
źródło
źródło
Odpowiedzi:
Jesteś na dobrej drodze z
${:+}
operatorem ekspansji, wystarczy go nieco zmodyfikować:Pierwsze nawiasy klamrowe rozszerzają się do,
$V
a dwukropek iffV
jest już ustawiony inaczej na nic - co jest dokładnie tym, czego potrzebujesz (i prawdopodobnie także jednym z powodów istnienia operatora).Zatem w twoim przypadku:
źródło
${V}${V:+:}W
Vs.${V:+${V}:}W
. Tak czy inaczej, oboje czują się naprawdę brzydcy. Miałem nadzieję na coś ... chyba bardziej eleganckiego?test
- w dowolny sposób testujesz wartość i zapisujesz nazwę zmiennej dwa razy, ale w ten sposób robisz to w pojedynczym poleceniu wykonania - w ten sposób jest to praktyczne , ale nigdy nie spotkałem eleganckiego komputera.export
. To bardzo dobra uwaga, poprawiłem również ten szczegół.Ostatnio założyłem GNU Stow na moich maszynach do sklepu użytkownika szeroki rzeczy jak biblioteki mocy
~/.local
i pobiegł do kłopotów przy określaniuLD_LIBRARY_PATH
,CPATH
iLIBRARY_PATH
, przypadkowo umieszczenie dwukropka tam i tak łamiąc rzeczy.Potem znalazłem twoje pytanie i odpowiedź nie była do końca elegancka ;-) i napisałem małą funkcję do obsługi tego, znajdź go tutaj: https://gist.github.com/rico-chet/0229e4c080d9f51a02535dd25a656a8a
// edytowane zgodnie z sugestią @Kusalananda
źródło
( IFS=:; set -- 1 2 3 4 5 6; echo "$*" )
join () { var=$1; shift; export "$var"="$( IFS=:; echo "$*" )"; }
${!variable:+${!variable}:}
w odpowiednim miejscu działało dla mnie, wszystkie testy przeszły pomyślnie. Znalezienie odpowiedniej nazwy jest zbyt duże dla czytelnika :)